触发创建新用户

时间:2014-03-11 13:29:39

标签: plsql oracle11g plsqldeveloper

我有一个名为 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

是否可以通过触发器创建用户?如果可能,那么正确的语法是什么?

1 个答案:

答案 0 :(得分:1)

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

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