我是DBA管理员,我想创建以下过程:
CREATE OR REPLACE PROCEDURE PRUEBAS.TOMAPRIVILEGIOS(USUARIOS VARCHAR) AS
BEGIN
EXECUTE IMMEDIATE 'REVOKE CONNECT TO '||USUARIOS||'';
END TOMAPRIVILEGIOS;
/
但是出现一个错误。
BEGIN PRUEBAS.TOMAPRIVILEGIOS('PRUEBAS'); END;
Informe de error -
ORA-00990: falta el privilegio o no es válido
ORA-06512: en "PRUEBAS.TOMAPRIVILEGIOS", línea 3
ORA-06512: en línea 1
00990. 00000 - "missing or invalid privilege"
*Cause:
*Action:
答案 0 :(得分:2)
如果要在过程中执行DDL,则需要使用动态SQL。 EXECUTE IMMEDIATE
可能是最简单的方法。像
CREATE OR REPLACE PROCEDURE( p_username IN VARCHAR2 )
AS
l_sql VARCHAR2(1000);
BEGIN
l_sql := 'GRANT CONNECT TO ' || dbms_assert.schema_name( p_username );
EXECUTE IMMEDIATE l_sql;
END;
通常,最简单的方法是在本地变量中构建要执行的字符串,然后将其传递给EXECUTE IMMEDIATE
。当您仅记录已构建的字符串而不是尝试找出语法错误是什么时,这使调试变得更加容易。使用动态SQL时,您容易遭受SQL注入攻击,因此您想使用dbms_assert
软件包或通过某些自定义方式来验证输入。
顺便说一句,您可能想创建自定义角色,而不是依靠CONNECT
之类的东西。 Oracle在10.2中从CONNECT
中删除了一堆权限,因此它现在仅允许数据库连接,但是在以前的版本中,它的功能远不如其名称所暗示的那样强大。通常,您不应该使用CONNECT
和RESOURCE
角色,通常最好使用所需的确切特权来创建自己的角色。