如何在尝试插入时解决此触发器错误?oracle sql

pgvzfuti  于 2023-05-22  发布在  Oracle
关注(0)|答案(1)|浏览(147)

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

奇怪的是我没有任何承诺

dgenwo3n

dgenwo3n1#

在我看来,你应该避免在这种情况下触发。在存储过程中执行所有操作。
顺便说一句,是什么导致了触发器中的提交:它是一个DDL,它在DDL语句之前和之后执行隐式提交。
你能在触发器中提交吗?当然可以,如果你让它成为一个自主的交易,但是-正如我所说的-我不会那样做。
这里有一个你可能会做的例子;代码应该由拥有不常见权限的用户运行-create user
包含用户的表:当然,以纯文本形式存储密码是明显错误的,但这只是一个简单的例子。

SQL> create table users
  2    (user_id     number generated always as identity primary key,
  3     username    varchar2(30) unique,
  4     password    varchar2(30)
  5    );

Table created.

过程:如果行不存在,则将其插入表中,如果插入了行,则创建用户:

SQL> create or replace procedure p_create_user
  2    (p_username in varchar2,
  3     p_password in varchar2
  4    ) as
  5  begin
  6    insert into users (username, password)
  7    select p_username, p_password
  8    from dual
  9    where not exists (select null
 10                      from users u
 11                      where u.username = p_username
 12                     );
 13    if sql%rowcount = 1 then
 14      execute immediate 'create user ' || p_username || ' identified by ' || p_password;
 15    end if;
 16  end;
 17  /

Procedure created.

让我们试试看:

SQL> exec p_create_user('littlefoot', 'whatever');

PL/SQL procedure successfully completed.

SQL> select * From users;

   USER_ID USERNAME                       PASSWORD
---------- ------------------------------ ------------------------------
         1 littlefoot                     whatever

是否可以再次插入同一用户?否:

SQL> exec p_create_user('littlefoot', 'whatever');

PL/SQL procedure successfully completed.

SQL> select * From users;

   USER_ID USERNAME                       PASSWORD
---------- ------------------------------ ------------------------------
         1 littlefoot                     whatever

不同的用户?

SQL> exec p_create_user('bigfoot', 'whatever');

PL/SQL procedure successfully completed.

SQL> select * From users;

   USER_ID USERNAME                       PASSWORD
---------- ------------------------------ ------------------------------
         1 littlefoot                     whatever
         2 bigfoot                        whatever

如果我尝试以新创建的用户身份连接会怎样:

SQL> connect littlefoot/whatever@pdb1
ERROR:
ORA-01045: user LITTLEFOOT lacks CREATE SESSION privilege; logon denied

Warning: You are no longer connected to ORACLE.
SQL>

显然,创建用户是不够的。它存在,但不能做任何事情。我想你以后会处理的。

相关问题