【问题标题】:Trigger for creating new user创建新用户的触发器
【发布时间】:2014-03-11 22:25:18
【问题描述】:

我有一个名为 LOGIN_NAMES 的表,它在 login_id 列下维护所有登录 ID 的列表。我正在尝试编写一个触发器,该触发器在向 login_id 插入值时创建一个新用户,类似于以下代码:

CREATE OR REPLACE TRIGGER login_id_create
  AFTER INSERT OR UPDATE
  ON  mySchema.LOGIN_NAMES
  FOR EACH ROW
BEGIN
  CREATE USER :NEW.login_id 
  IDENTIFIED BY password 
  DEFAULT TABLESPACE users
  QUOTA 10M ON users
  PASSWORD EXPIRE;

  GRANT CONNECT TO :NEW.login_id;
END

难道不能通过触发器创建用户吗?如果可能,正确的语法是什么?

【问题讨论】:

    标签: plsql oracle11g plsqldeveloper


    【解决方案1】:

    创建用户是 DDL。 DDL 涉及两次隐式提交,一次在语句运行之前,一次在语句运行之后。触发器(除非声明使用不适合此处的自治事务)不能提交或回滚事务。所以你不能从触发器发出 DDL。如果可以,您不会想要这样做——例如,如果在 LOGIN_NAMES 中插入一行的事务被回滚,或者 Oracle 必须多次执行触发器以实现写入一致性怎么办。

    您可以使用dbms_job 包提交一个作业,该作业将在触发事务提交后运行,该事务将使用动态 SQL(EXECUTE IMMEDIATE 最有可能)创建用户并运行GRANT。我很难想象你会希望这种情况发生在UPDATE 而不是仅仅在INSERT 上,否则每次有人更新表中的某些属性时你都会尝试(并且失败)创建用户.想要以这种方式进行配置将是一个非常不寻常的设计——如果您想要维护自己的表来存储有关用户的信息,那通常意味着您想要创建应用程序用户而不是 Oracle 用户。如果你想创建 Oracle 用户,创建自己的表来存储这些信息通常是没有意义的,只需从 dba_users 获取。

    【讨论】:

    • 感谢您的回答。实际上,我正在尝试开发一个 DBA 工具来管理多个 DB 服务器。我必须管理有关用户的信息,例如 email_id 以通知他们的配额(对象和模式的数量)。所以,我想到了单独维护用户记录。您能否建议一种更好的方法(或替代方法)通过插入新记录并通过删除删除用户来创建数据库用户。
    • @Syam - 我强烈希望您开发的“DBA 工具”在自定义表中插入您想要的任何信息后直接发出适当的CREATE USERGRANT 语句。我没有看到通过提交创建用户的作业的触发器获得任何东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-31
    相关资源
    最近更新 更多