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

Oracle11g 如何创建一个过程来授予特权,oracle11g,oracle-sqldeveloper,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'); EN

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

如果要在过程中执行DDL,则需要使用动态SQL<代码>立即执行可能是最简单的方法。差不多

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;
通常,最简单的方法是在局部变量中建立要执行的字符串,然后将其传递给
executeimmediate
。这使得调试更加容易,因为您只需记录已生成的字符串,而不必试图找出语法错误是什么。当您使用动态SQL时,您将面临SQL注入攻击,因此您需要使用
dbms\u assert
包或通过一些自定义方式验证您的输入


另外,您可能希望创建自定义角色,而不是依赖于
CONNECT
之类的东西。Oracle在10.2中从
CONNECT
中删除了一系列权限,因此它现在只允许数据库连接,但在以前的版本中,它比名称所暗示的功能强大得多。通常不应使用
CONNECT
RESOURCE
角色,通常最好使用所需的确切权限创建自己的角色。

如果要在过程中执行DDL,则需要使用动态SQL<代码>立即执行可能是最简单的方法。差不多

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;
通常,最简单的方法是在局部变量中建立要执行的字符串,然后将其传递给
executeimmediate
。这使得调试更加容易,因为您只需记录已生成的字符串,而不必试图找出语法错误是什么。当您使用动态SQL时,您将面临SQL注入攻击,因此您需要使用
dbms\u assert
包或通过一些自定义方式验证您的输入


另外,您可能希望创建自定义角色,而不是依赖于
CONNECT
之类的东西。Oracle在10.2中从
CONNECT
中删除了一系列权限,因此它现在只允许数据库连接,但在以前的版本中,它比名称所暗示的功能强大得多。一般来说,您不应该使用
CONNECT
RESOURCE
角色,您最好使用您想要的确切权限创建自己的角色。

谢谢Justin,现在可以了!!谢谢贾斯汀,现在一切正常!!