1. 创建两个用户:xxpo,xxgl
2. 在xxpo下创建一张表:xxpo_authid_test
CREATE TABLE xxpo.xxpo_authid_test(ID NUMBER,NAME VARCHAR2(20));
3. 在xxpo下创建如下两个procedure
3.1 xxpo_no_authid_test_prc:
CREATE OR REPLACE PROCEDURE xxpo_no_authid_test_prc(p_id IN NUMBER,p_name IN VARCHAR2) ISBEGININSERT INTO xxpo_authid_test(id,NAME)VALUES(p_id,p_name);END xxpo_no_authid_test_prc;
3.2 xxpo_has_authid_test_prc:
CREATE OR REPLACE PROCEDURE xxpo_has_authid_test_prc(p_id IN NUMBER,p_name IN VARCHAR2) AUTHID CURRENT_USER ISBEGININSERT INTO xxpo_authid_test(id,NAME)VALUES(p_id,p_name);END xxpo_has_authid_test_prc;
4. 将两个procedure的执行权限(EXECUTE)赋予xxgl:
SQL> GRANT EXECUTE ON xxpo_no_authid_test_prc TO xxgl;Grant succeededSQL> GRANT EXECUTE ON xxpo_has_authid_test_prc TO xxgl;Grant succeeded
5. 在xxgl分别调用xxpo下面的两个procedure,查看结果:
SQL> BEGIN2 xxpo.xxpo_no_authid_test_prc(1,'nameXXGL001');3 END;4 /PL/SQL procedure successfully completedSQL> SQL> BEGIN2 xxpo.xxpo_has_authid_test_prc(2,'nameXXGL002');3 END;4 /BEGINxxpo.xxpo_has_authid_test_prc(2,'nameXXGL002');END;ORA-00942: table or view does not existORA-06512: at "XXPO.XXPO_HAS_AUTHID_TEST_PRC", line 7ORA-06512: at line 3SQL> SELECT * FROM xxpo.xxpo_authid_test;ID NAME---------- --------------------1 nameXXGL001SQL>
由于我们并没有在xxgl用户下创建一个名为xxpo_authid_test的表,所以当我们在xxgl用户下以调用者(xxgl)权限去执行xxpo.xxpo_has_authid_test_prc这个procedure的时候,会报表不能找到(ORA-00942)的错误;而以定义者(xxpo)权限去执行则不存在此问题。