表NISHAN.TBL_ADMIN正在变异,触发器/函数可能看不到它

时间:2018-06-01 03:02:59

标签: oracle triggers

我有一个名为tr_admin_user_role的触发器,当我们在另一个名为tbl_user_role的表中执行插入时,会自动将值插入tbl_admin表。编译时没有错误,但每当我在tbl_admin表中插入一个值时,它都会显示错误,错误就像

enter image description here

这是我的tbl_admin表

CREATE TABLE tbl_admin(
    admin_id INTEGER,
    username VARCHAR2(50) NOT NULL UNIQUE,
    passwords VARCHAR2(50) NOT NULL,
    email VARCHAR2(100) UNIQUE,
    enabled CHAR(1) DEFAULT 1 NOT NULL,
    created_at DATE DEFAULT SYSDATE NOT NULL,
    CONSTRAINT pk_admin_id PRIMARY KEY(admin_id)
);

tbl_user_role

CREATE TABLE tbl_user_role(
    user_role_id INTEGER,
    username VARCHAR2(50) NOT NULL,
    user_role VARCHAR2(50) DEFAULT 'ROLE_ADMIN' NOT NULL,
    CONSTRAINT pk_user_role_id PRIMARY KEY(user_role_id)
);

我已创建的触发器

CREATE OR REPLACE TRIGGER tr_admin_user_role
AFTER INSERT ON tbl_admin
FOR EACH ROW
DECLARE
new_username TBL_ADMIN.username%TYPE;
BEGIN

    SELECT username INTO new_username FROM (
        SELECT username FROM tbl_admin ORDER BY username DESC
    ) WHERE ROWNUM = 1;

    INSERT INTO tbl_user_role(username, user_role) VALUES(new_username, 'ROLE_ADMIN');
END;

插入声明

INSERT INTO tbl_admin(username, passwords) VALUES('nisha', 'nisha');

1 个答案:

答案 0 :(得分:1)

这不是你如何获取触发器中列的新插入/更新/先前值。您应该使用:OLD.column_name:NEW.column_name来引用旧列和新列。阅读documentation以了解更多信息。

因此,您的触发器可以重写为

CREATE OR REPLACE TRIGGER tr_admin_user_role AFTER
    INSERT ON tbl_admin
    FOR EACH ROW
BEGIN
    INSERT INTO tbl_user_role (
        username,
        user_role
    ) VALUES (
        :NEW.username,
        'ROLE_ADMIN'
    );

END;
/

我假设你正在使用另一个触发器来生成 admin_iduser_role_id,因为它们被声明为PRIMARY KEY s 而且你没有将它们包含在插页中。

Db fiddle demo

这里我使用了这些列的虚拟值。