我有一个名为tr_admin_user_role
的触发器,当我们在另一个名为tbl_user_role
的表中执行插入时,会自动将值插入tbl_admin
表。编译时没有错误,但每当我在tbl_admin
表中插入一个值时,它都会显示错误,错误就像
这是我的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');
答案 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_id
和user_role_id
,因为它们被声明为PRIMARY KEY
s
而且你没有将它们包含在插页中。
这里我使用了这些列的虚拟值。