Oracle11g 如何创建一个过程来授予特权
我是DBA管理员,我想创建以下过程: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
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,现在可以了!!谢谢贾斯汀,现在一切正常!!