问题:

SQL> conn hr/hr
Error accessing PRODUCT_USER_PROFILE
Warning:  Product user profile information not loaded!  You may need to run PUPBLD.SQL  as SYSTEM
Connected.
SQL>

问题分析:

这个错误提示实际意义上这只是一个警告而已,并不是真正的错误,遇到这个提示,并不会影响我们正常使用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来验证一下改表已经创建,并且熟悉一下表的结构。

代码示例:

SQL> conn hr/hr
Error accessing PRODUCT_USER_PROFILE
Warning:  Product user profile information not loaded!
You may need to run PUPBLD.SQL as SYSTEM
Connected.
SQL> conn system/test
Connected.
SQL> @/u01/oracle/sqlplus/admin/pupbld.sql
DROP SYNONYM PRODUCT_USER_PROFILE
             *
ERROR at line 1:
ORA-01434: private synonym to be dropped does not exist


  DATE_VALUE FROM PRODUCT_USER_PROFILE
                  *
ERROR at line 3:
ORA-00980: synonym translation is no longer valid


DROP TABLE PRODUCT_USER_PROFILE
           *
ERROR at line 1:
ORA-00942: table or view does not exist


ALTER TABLE SQLPLUS_PRODUCT_PROFILE ADD (LONG_VALUE LONG)
*
ERROR at line 1:
ORA-00942: table or view does not exist

 

Table created.

DROP TABLE PRODUCT_PROFILE
           *
ERROR at line 1:
ORA-00942: table or view does not exist


DROP VIEW PRODUCT_PRIVS
*
ERROR at line 1:
ORA-00942: table or view does not exist

 

View created.


Grant succeeded.


Synonym dropped.


Synonym created.

DROP SYNONYM PRODUCT_USER_PROFILE
             *
ERROR at line 1:
ORA-01434: private synonym to be dropped does not exist

 

Synonym created.


Synonym dropped.


Synonym created.

SQL> conn hr/hr
Connected.
SQL> desc product_user_profile
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
 PRODUCT                                   NOT NULL VARCHAR2(30)
 USERID                                             VARCHAR2(30)
 ATTRIBUTE                                          VARCHAR2(240)
 SCOPE                                              VARCHAR2(240)
 NUMERIC_VALUE                                      NUMBER(15,2)
 CHAR_VALUE                                         VARCHAR2(240)
 DATE_VALUE                                         DATE
 LONG_VALUE                                         LONG

SQL>

以上不是这篇小文章的重点,下面我们要利用这张表来限制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表中的内容。
 

解决方法:

1、以system用户登录

2、执行/u01/oracle/sqlplus/admin/pupbld.sql

3、查看product_user_profile表是否存在,存在就证明sql语句执行成功