我有一个sp和一个触发器,触发器应该在我插入到users表之后调用过程,这样我就可以创建一个新的会话用户,但是当我尝试插入时,我得到以下错误:
- ORA-04092:无法在触发器中提交ORA-06512:at“SQL_VNNKBUUOCEZLLPHWSSGEFNOQE.CREAR_USUARIO”,line 10
- ORA-06512:at“SQL_VNNKBUUOCEZLLPHWSSGEFNOQE.TRG_INSERT_USUARIO”,line 2
- ORA-06512:在“SYS.DBMS_SQL”,第1721行
这是我的SQL代码:
CREATE OR REPLACE PROCEDURE crear_usuario(
p_nombre_de_usuario IN VARCHAR2,
p_correo IN VARCHAR2,
p_contrasenia IN VARCHAR2
)
AS
BEGIN
EXECUTE IMMEDIATE 'CREATE USER ' || p_nombre_de_usuario || ' IDENTIFIED BY ' || p_contrasenia;
END;
CREATE OR REPLACE TRIGGER trg_insert_usuario
AFTER INSERT ON usuario
FOR EACH ROW
BEGIN
crear_usuario(:NEW.nombre_de_usuario, :NEW.correo, :NEW.contrasenia);
END;
奇怪的是我没有任何承诺
1条答案
按热度按时间dgenwo3n1#
在我看来,你应该避免在这种情况下触发。在存储过程中执行所有操作。
顺便说一句,是什么导致了触发器中的提交:它是一个DDL,它在DDL语句之前和之后执行隐式提交。
你能在触发器中提交吗?当然可以,如果你让它成为一个自主的交易,但是-正如我所说的-我不会那样做。
这里有一个你可能会做的例子;代码应该由拥有不常见权限的用户运行-
create user
。包含用户的表:当然,以纯文本形式存储密码是明显错误的,但这只是一个简单的例子。
过程:如果行不存在,则将其插入表中,如果插入了行,则创建用户:
让我们试试看:
是否可以再次插入同一用户?否:
不同的用户?
如果我尝试以新创建的用户身份连接会怎样:
显然,创建用户是不够的。它存在,但不能做任何事情。我想你以后会处理的。