下面是存储过程的定义:
CREATE OR REPLACE PROCEDURE usp_dropTable(schema VARCHAR, tblToDrop VARCHAR) IS
BEGIN
DECLARE v_cnt NUMBER;
BEGIN
SELECT COUNT(*)
INTO v_cnt
FROM all_tables
WHERE owner = schema
AND table_name = tblToDrop;
IF v_cnt > 0 THEN
EXECUTE IMMEDIATE('DROP TABLE someschema.some_table PURGE');
END IF;
END;
END;
这是电话:
CALL usp_dropTable('SOMESCHEMA', 'SOME_TABLE');
出于某种原因,我不断收到 EXECUTE IMMEDIATE 命令的权限不足错误。上网查了一下,发现权限不足的错误,一般是oracle用户账户没有权限执行查询中使用的命令passes,本例中为DROP。但是,我有删除权限。我真的很困惑,我似乎找不到适合我的解决方案。
提前谢谢你。
解决方案:
正如史蒂夫在下面提到的,Oracle 安全模型很奇怪,因为它需要在过程中的某个地方明确知道要使用什么样的权限。让 Oracle 知道这一点的方法是在 CREATE OR REPLACE 语句中使用 AUTHID 关键字。如果您想要与过程的创建者相同级别的权限,则使用 AUTHID DEFINER。如果希望 Oracle 使用当前运行存储过程的用户的权限,则需要使用 AUTHID CURRENT_USER。过程声明如下所示:
CREATE OR REPLACE PROCEDURE usp_dropTable(schema VARCHAR, tblToDrop VARCHAR)
AUTHID CURRENT_USER IS
BEGIN
DECLARE v_cnt NUMBER;
BEGIN
SELECT COUNT(*)
INTO v_cnt
FROM all_tables
WHERE owner = schema
AND table_name = tblToDrop;
IF v_cnt > 0 THEN
EXECUTE IMMEDIATE('DROP TABLE someschema.some_table PURGE');
END IF;
END;
END;
谢谢大家的回复。这绝对是一个非常烦人的问题。