使用product_user_profile來實現用戶權限的設定
2024-07-21 02:38:22
供稿:網友
我們有時候在以普通用戶登錄SQL*Plus的時候,會碰到下面的錯誤提示:
Error accessing PRODUCT_USER_PROFILE
Warning: Product user profile information not loaded!
You may need to run PUPBLD.SQL as SYSTEM
其實在實際意義上這只是一個警告而已,并不是真正的錯誤,碰到這個提示,并不會影響我們正常使用SQL*Plus,也不會對數據庫功能產生影響。
假如數據庫是使用dbca創建的那么不用擔心這個問題,通常是我們手動創建數據庫的情況下,忘了執行一些腳本才導致出現這樣的警告。PRODUCT_USER_PROFILE其實有很強大的功能,這是SYSTEM模式下的一個表,在此表中存在的數據可以讓客戶端程序登入的時候檢查是否在命令的執行上有什么限制。基本上我們是以它來限制SQL*Plus這個客戶端程序(目前似乎也只有這個程序才會去自動檢查這張表:D)
假如不想看到這個警告,作如下操作:
以SYSTEM用戶登入SQL*Plus,然后執行PUPBLD.SQL,這個文件通常在$Oracle_HOME/sqlplus/admin目錄中。
SQL> @$ORACLE_HOME/sqlplus/admin/pupbld.sql
執行完畢以后,可以desc product_user_profile來驗證一下改表已經創建,并且熟悉一下表的結構。
以上不是這篇小文章的重點,下面我們要利用這張表來限制SCOTT用戶不能執行DROP命令,即使SCOTT用戶擁有DROP TABLE的權限。
SQL> insert into product_user_profile (
2 product, userid, attribute, char_value)
3 values (
4 'SQL*Plus','SCOT%','DROP','DISABLED');
1 row inserted
Executed in 0.01 seconds
SQL> commit;
Commit complete
Executed in 0 seconds
然后退出SYSTEM用戶,用SCOTT用戶登錄,作個測試:
SQL> create table t_test_profile(
2 id number);
Table created.
Elapsed: 00:00:00.10
SQL> drop table t_test_profle;
SP2-0544: invalid command: drop
這就是product_user_profile的作用,回顧一下:
1。假如我們把DROP改成CREATE或者UPDATE那么就對用戶禁止了這些命令。
2。從上面的insert語句,我們可以看到對于用戶的限制支持通配符,所有以SCOT開頭的用戶都不能執行指定的命令。
3。修改了product_user_profile內容,用戶必須重新登錄SQL*Plus,修改才會生效,也就是只有在登錄的時候,SQL*Plus才會檢查一遍product_user_profile表中的內容。