我有一个名为 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
是否可以通过触发器创建用户?如果可能,那么正确的语法是什么?
答案 0 :(得分:1)
创建用户是DDL。 DDL涉及两个隐式提交,一个在语句运行之前,一个在语句运行之后。触发器(除非声明为使用此处不合适的自治事务)不能提交或回滚事务。所以你不能从触发器发出DDL。如果可以的话,你不会想要 - 例如,如果在LOGIN_NAMES
中插入行的事务被回滚,或者如果Oracle必须多次执行触发器以实现写入一致性,那该怎么办。
您可以使用dbms_job
包提交一个作业,该作业将在提交的触发事务中运行,该事务将使用动态SQL(最有可能EXECUTE IMMEDIATE
)来创建用户并运行{{1} }。我很难想象你希望在GRANT
而不是UPDATE
上发生这种情况,否则你每次有人更新时都会尝试(并且失败)创建用户表格中的属性。想要以这种方式配置是一种非常不寻常的设计 - 如果您想维护自己的表来存储有关用户的信息,这通常意味着您希望创建应用程序用户而不是Oracle用户。如果您想创建Oracle用户,通常创建自己的表来存储该信息是没有意义的,只需从INSERT
获取它。