【问题标题】:Execute a stored procedure through a trigger right after a user was created on the database在数据库上创建用户后立即通过触发器执行存储过程
【发布时间】:2017-08-09 00:26:17
【问题描述】:

我想写一个程序可以给新创建的用户授予角色权限。

我的想法是我首先创建一个这样的程序:

CREATE OR REPLACE PROCEDURE P_CREATE_USER

BEGIN
EXECUTE IMMEDIATE 'GRANT RESOURCE TO'||ora_dict_obj_name;
EXECUTE IMMEDIATE 'GRANT CONNECT TO'||ora_dict_obj_name;

END;
/

然后,在数据库上创建用户后,我创建了一个触发器,它执行此过程。像这样:

CREATE OR REPLACE TRIGGER T_CREATE_USER
AFTER CREATE ON DATABASE
WHEN (ora_dict_obj_type = 'USER')

BEGIN
  P_CREATE_USER;
END;
/

确实没用,你有其他建议吗?

我使用 Oracle 作为 DBMS。

【问题讨论】:

  • 这是来自your previous question 的解决方案,您接受并说“它有效”。现在你说“它并没有真正起作用”。那么,它有什么方法不起作用呢?您还有什么额外要求?
  • 您是 DBA 吗?还是只是在玩 XE?
  • @APC 是的,你是对的,我说“它有效”,但额外的要求是,我需要知道,我如何使用由触发器调用的过程来做到这一点。
  • @tbone 我不是真正的 DBA,但我想学习它。

标签: sql oracle stored-procedures plsql triggers


【解决方案1】:

所以问题是这样的:你的触发器抛出ORA-30511: invalid DDL operation in system triggers

原因是,我们不能在触发器中提交。 DDL 发出隐式提交(在语句之前和之后)。因此,您的触发器无法正常工作,也无法正常工作。

触发器中提交的解决方法是pragma AUTONOMOUS TRANSACTION,这会导致触发器在隔离会话中运行。此处不会显示,因为新创建的用户在自治会话中不可见。

封装逻辑的最佳方法是:

CREATE OR REPLACE PROCEDURE P_CREATE_USER
   (p_user_name in varchar2
    , p_password in varchar2)
is
BEGIN
    EXECUTE IMMEDIATE ' create user '||p_user_name ||' identified by '||p_password;
    EXECUTE IMMEDIATE 'GRANT RESOURCE TO'||p_user_name ;
    EXECUTE IMMEDIATE 'GRANT CONNECT TO'||p_user_name ;

END;
/

【讨论】:

    【解决方案2】:

    在 SQL server 中,一个用户,比如你可以执行一个过程来授予一个新创建的用户 SQL 权限。进行这项工作的条件是用户的帐户,例如您的帐户需要对该 SQL 权限进行“授予”,以便能够授予其他新用户此 SQL 权限

    【讨论】:

    • 请注意,在 SO 上,[sql] 标记仅指 SQL 问题,并不意味着 MSSQL 具有标记 [sql-server](或类似标记)。这个问题被标记为[oracle]。所以在 SQL Server 中发生的事情是无关紧要的。碰巧,Oracle 也具有 WITH GRANT 功能,但它与 OP 的实际问题无关。 SO上有很多关于SQL Server的问题:如果那是您的专业领域。祝你好运。
    • 感谢您的澄清
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-08
    • 1970-01-01
    • 2019-06-24
    相关资源
    最近更新 更多