Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle11g 如何创建一个过程来授予特权_Oracle11g_Oracle Sqldeveloper - Fatal编程技术网

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,现在可以了!!谢谢贾斯汀,现在一切正常!!