如何创建一个授予特权的过程

时间:2019-04-07 15:57:40

标签: oracle11g oracle-sqldeveloper

我是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:

1 个答案:

答案 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中删除了一堆权限,因此它现在仅允许数据库连接,但是在以前的版本中,它的功能远不如其名称所暗示的那样强大。通常,您不应该使用CONNECTRESOURCE角色,通常最好使用所需的确切特权来创建自己的角色。