这是我曾经写过的例子是不是你写的存储过程有问题,或者执行语句有问题啊 以用户A登录 用户A中有表dept和mydept,且有相同的字段,dept中有数据,mydept没有数据 --创建存储过程 create or replace procedure insert_mydept is begin insert into mydept select t.deptno,t.dname,t.loc from dept t where t.deptno not in (select s.deptno from mydept s); commit; end insert_mydept;
以用户B登录 --调用存储过程 call A.insert_mydept();再以用户A登录 select * from mydept; 你会发现mydept有数据了
DBA角色本身已经有execute_any procedure权限SQL> show user USER 为 "SYS" SQL> create or replace procedure eht.test_proc 2 is 3 begin 4 null; 5 end; 6 /过程已创建。SQL> show error 没有错误。 SQL> conn scott/scott@test 已连接。 SQL> exec test_proc BEGIN test_proc; END; * 第 1 行出现错误: ORA-06550: 第 1 行, 第 7 列: PLS-00201: 必须声明标识符 'TEST_PROC' ORA-06550: 第 1 行, 第 7 列: PL/SQL: Statement ignored SQL> exec eht.test_proc BEGIN eht.test_proc; END; * 第 1 行出现错误: ORA-06550: 第 1 行, 第 7 列: PLS-00201: 必须声明标识符 'EHT.TEST_PROC' ORA-06550: 第 1 行, 第 7 列: PL/SQL: Statement ignored SQL> conn sys/top10@test as sysdba 已连接。 SQL> grant dba to scott 2 ;授权成功。SQL> conn scott/scott@test 已连接。 SQL> exec test_proc BEGIN test_proc; END; * 第 1 行出现错误: ORA-06550: 第 1 行, 第 7 列: PLS-00201: 必须声明标识符 'TEST_PROC' ORA-06550: 第 1 行, 第 7 列: PL/SQL: Statement ignored SQL> exec eht.test_procPL/SQL 过程已成功完成。SQL>
你是在过程中调用的,默认角色继承权限失效。 不过授予execute any procedure权限有点大,不安全,最小权限原则,授予Auser该存储过程上的执行权限即可。
以用户A登录
用户A中有表dept和mydept,且有相同的字段,dept中有数据,mydept没有数据
--创建存储过程
create or replace procedure insert_mydept
is
begin
insert into mydept select t.deptno,t.dname,t.loc from dept t where t.deptno not in (select s.deptno from mydept s);
commit;
end insert_mydept;
以用户B登录
--调用存储过程
call A.insert_mydept();再以用户A登录
select * from mydept;
你会发现mydept有数据了
USER 为 "SYS"
SQL> create or replace procedure eht.test_proc
2 is
3 begin
4 null;
5 end;
6 /过程已创建。SQL> show error
没有错误。
SQL> conn scott/scott@test
已连接。
SQL> exec test_proc
BEGIN test_proc; END; *
第 1 行出现错误:
ORA-06550: 第 1 行, 第 7 列:
PLS-00201: 必须声明标识符 'TEST_PROC'
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored
SQL> exec eht.test_proc
BEGIN eht.test_proc; END; *
第 1 行出现错误:
ORA-06550: 第 1 行, 第 7 列:
PLS-00201: 必须声明标识符 'EHT.TEST_PROC'
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored
SQL> conn sys/top10@test as sysdba
已连接。
SQL> grant dba to scott
2 ;授权成功。SQL> conn scott/scott@test
已连接。
SQL> exec test_proc
BEGIN test_proc; END; *
第 1 行出现错误:
ORA-06550: 第 1 行, 第 7 列:
PLS-00201: 必须声明标识符 'TEST_PROC'
ORA-06550: 第 1 行, 第 7 列:
PL/SQL: Statement ignored
SQL> exec eht.test_procPL/SQL 过程已成功完成。SQL>
不过授予execute any procedure权限有点大,不安全,最小权限原则,授予Auser该存储过程上的执行权限即可。