今天在看定义者、调用者权限部分想到的这个问题。
对于调用者权限存储过程,不同的用户访问是本用户下的表,但是如果存储过程的OWNER用户下存储过程所依赖的表被删除,其他用户下还能否正常运行这个过程。
做了个简单的测试:
SQL> CONN YANGTK/YANGTK
已连接。
SQL> CREATE TABLE T (ID NUMBER);
表已创建。
SQL> CREATE OR REPLACE PROCEDURE P_TEST
2 AUTHID CURRENT_USER
3 AS
4 BEGIN
5 INSERT INTO T VALUES (1);
6 END;
7 /
过程已创建。
SQL> GRANT EXECUTE ON P_TEST TO TEST;
授权成功。
SQL> CONN TEST/TEST
已连接。
SQL> CREATE TABLE T (ID NUMBER);
表已创建。
SQL> EXEC YANGTK.P_TEST
PL/SQL 过程已成功完成。
SQL> SELECT * FROM T;
ID
----------
1
SQL> CONN YANGTK/YANGTK
已连接。
SQL> DROP TABLE T PURGE;
表已删除。
SQL> SELECT OBJECT_NAME, OBJECT_TYPE, STATUS
2 FROM USER_OBJECTS
3 WHERE OBJECT_NAME = 'P_TEST';
OBJECT_NAME OBJECT_TYPE STATUS
------------------------------ ------------------- -------
P_TEST PROCEDURE INVALID
SQL> CONN TEST/TEST
已连接。
SQL> EXEC YANGTK.P_TEST
BEGIN YANGTK.P_TEST; END;
*
第 1 行出现错误:
ORA-06550: 第 1 行, 第 14 列:
PLS-00905: 对象 YANGTK.P_TEST 无效
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored
虽然TEST用户执行YANGTK用户下的P_TEST过程,插入的是自己用户中的T表,但是如果存储过程的OWNER用户删除了过程依赖的表,即使其他用户下存储过程仍然可以执行,Oracle也会将存储过程置于INVALID状态,而且其他用户运行并不会导致存储过程成功编译,也就是说调用者存储过程依赖OWNER下的对象。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4227/viewspace-674736/ ,如需转载,请注明出处,否则将追究法律责任。