下面是存储过程的定义:
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用户帐户对case查询中使用的命令没有权限,在本例中是DROP。但是,我有drop特权。我真的很困惑,我似乎找不到一个适合我的解决方案。
提前感谢你。
解决方案:
正如Steve在下面提到的,Oracle安全模型很奇怪,因为它需要在过程中的某个位置显式地知道要使用哪种权限。让Oracle知道这一点的方法是在CREATE OR REPLACE语句中使用AUTHID关键字。如果您希望与过程的创建者具有相同级别的权限,则可以使用AUTHID定义者。如果希望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;
感谢大家的回复。这绝对是一个非常烦人的问题,要找到解决方案。
发布于 2009-06-15 07:16:56
Oracle的安全模型是这样的:在使用Execute Immediate (在PL/SQL块或过程的上下文中)执行动态SQL时,用户对通过角色成员身份授予的对象或命令没有权限。您的用户可能具有"DBA“角色或类似角色。您必须显式授予此用户"drop table“权限。如果您试图从另一个模式(如sys或system)中的表中进行选择,情况也是如此-您需要向该用户授予对该表的显式select权限。
发布于 2016-08-21 09:07:06
您可以在过程定义的主体中使用"AUTHID CURRENT_USER“来满足您的需求。
发布于 2011-06-04 09:54:44
或者,如果需要,可以授予用户DROP_ANY_TABLE
特权,该过程将按原样运行,不需要任何更改。也许是危险的,但这取决于你在做什么:)
https://stackoverflow.com/questions/996198
复制相似问题