这里是存储过程的定义:执行即时在存储过程中不断给特权时不足错误
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;
这里是呼叫:
出于某种原因,我不断收到不足EXECUTE IMMEDIATE命令的权限错误。我查看了联机状态,发现权限不足通常意味着oracle用户帐户对查询中使用的传递命令(在本例中为DROP)没有权限。不过,我有权限下降。我很困惑,我似乎无法找到适合我的解决方案。
感谢您提前。
SOLUTION:
正如史蒂夫下文提到,甲骨文的安全模型是怪异的,因为它需要知道使用什么样的权限,程序明确的地方。让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;
谢谢大家的回复。这是解决问题的绝对烦人的问题。
我正面临着类似的问题,但有趣的是,不使用“AUTHID DEFINER”或“AUTHID CURRENT_USER”的过程,对于DROP TABLE执行声明,但不适用于创建表。 AUTHID解决方案有效:)谢谢! – Aniket 2012-08-21 18:16:38
谢谢,这两个字“AUTHID CURRENT_USER”解决了我的问题!谢谢! – Roman 2014-02-17 18:07:56