SQL> show user USER 为 "SYS" SQL> select count(*) from sys.all_Objects; COUNT(*) ---------- 49310SQL> conn ggz/ggz 已连接。 SQL> show user USER 为 "GGZ" SQL> select count(*) from sys.all_Objects; COUNT(*) ---------- 40685SQL> conn scott/scott 已连接。 SQL> show user USER 为 "SCOTT" SQL> select count(*) from sys.all_Objects; COUNT(*) ---------- 40855SQL>看出区别了没?以其他用户登录,查询sys.all_Objects结果不尽相同。 过程里与单独执行时,metadata的权限不一样。单独执行时,metadata用户权限和角色权限均可用,过程里,默认只有直接授权可用,角色继承权限无用。 所以,过程里和单独执行看见的数据并不一样! 强大的ORACLE!!!!!
我知道过程和单独执行的权限不一样,但是我连sysdba的都赋予给metadata了。 过程代码如下: CREATE OR REPLACE Procedure Cccc As v_retcode varchar2(100); v_retinfo varchar2(100); v_dd int; Begin
Insert Into ccc (Object_Id, Function_Code, Function_Name, Function_Desc, Version_No, Version_Comment, Last_Ddl_Time, Last_Dml_Time, Version_Created, Created_User, Created_Time, Audit_Status, Is_Valid) Select '1003101' || To_Char(a.Object_Id), a.Object_Name, a.Object_Name, '0' Object_Desc, '1', '初始化版本', a.Last_Ddl_Time Last_Ddl_Time, a.Last_Ddl_Time Last_Dml_Time, Sysdate, 'DM', Sysdate, '1', 'Y' From sys.all_Objects a Where a.Object_Type = 'FUNCTION' And A.OWNER ='DM'; Commit; Exception When Others Then v_retinfo := Sqlerrm; v_retcode := 'FAIL'; End; 如果我单独在过程里执行一个如下的过程则无问题 CREATE OR REPLACE PROCEDURE temp_z IS BEGIN insert into temp_zt select * from all_objects; commit; END temp_z; all_object的所有数据会插入进temp_zt,我就是没搞懂为什么增加了条件数据却无法插入数据进表了
首先,SYSDBA除了让你的数据库存在安全隐患(当然,你可以说,我只是学习库。),以SYSDBA登录,即SYS用户,和metadata无任何关系。 其次, CREATE OR REPLACE PROCEDURE temp_z IS BEGIN insert into temp_zt select * from all_objects; commit; END temp_z; 执行后,查看temp_zt 有没有Function_Name值为属于DM用户的FUNCTION的数据,有数据不等于有属于DM用户的FUNCTION的数据!!!!!
USER 为 "SYS"
SQL> select count(*) from sys.all_Objects; COUNT(*)
----------
49310SQL> conn ggz/ggz
已连接。
SQL> show user
USER 为 "GGZ"
SQL> select count(*) from sys.all_Objects; COUNT(*)
----------
40685SQL> conn scott/scott
已连接。
SQL> show user
USER 为 "SCOTT"
SQL> select count(*) from sys.all_Objects; COUNT(*)
----------
40855SQL>看出区别了没?以其他用户登录,查询sys.all_Objects结果不尽相同。
过程里与单独执行时,metadata的权限不一样。单独执行时,metadata用户权限和角色权限均可用,过程里,默认只有直接授权可用,角色继承权限无用。
所以,过程里和单独执行看见的数据并不一样!
强大的ORACLE!!!!!
过程代码如下:
CREATE OR REPLACE Procedure Cccc As
v_retcode varchar2(100);
v_retinfo varchar2(100);
v_dd int;
Begin
Insert Into ccc
(Object_Id,
Function_Code,
Function_Name,
Function_Desc,
Version_No,
Version_Comment,
Last_Ddl_Time,
Last_Dml_Time,
Version_Created,
Created_User,
Created_Time,
Audit_Status,
Is_Valid) Select '1003101' || To_Char(a.Object_Id),
a.Object_Name,
a.Object_Name,
'0' Object_Desc,
'1',
'初始化版本',
a.Last_Ddl_Time Last_Ddl_Time,
a.Last_Ddl_Time Last_Dml_Time,
Sysdate,
'DM',
Sysdate,
'1',
'Y'
From sys.all_Objects a
Where a.Object_Type = 'FUNCTION'
And A.OWNER ='DM';
Commit;
Exception
When Others Then
v_retinfo := Sqlerrm;
v_retcode := 'FAIL';
End;
如果我单独在过程里执行一个如下的过程则无问题
CREATE OR REPLACE PROCEDURE temp_z IS
BEGIN
insert into temp_zt select * from all_objects;
commit;
END temp_z;
all_object的所有数据会插入进temp_zt,我就是没搞懂为什么增加了条件数据却无法插入数据进表了
其次,
CREATE OR REPLACE PROCEDURE temp_z IS
BEGIN
insert into temp_zt select * from all_objects;
commit;
END temp_z;
执行后,查看temp_zt 有没有Function_Name值为属于DM用户的FUNCTION的数据,有数据不等于有属于DM用户的FUNCTION的数据!!!!!
以DM登录,执行
select 'grant execute on '||NAME||' to metadata;' from user_source
where type='FUNCTION';
然后将结果拷贝出来,执行所有语句。其他对象雷同,不一一列举。