每当我将记录添加到不同的表时,我都会写一个触发器来更新表。基本上,我有一个用户记录表。每当我向该表添加记录时,我都希望触发器为该新用户创建一些权限。有一个表具有存储在其中的所有用户角色和相关权限。创建新权限的方法是使用users表和role_permissions表之间的完全外部联接。那个SQL看起来像这个
insert into user_perms (user_id, perm_id, value)
select personnel.user_id AS user_id, role_perms.perm_id AS perm_id, role_perms.value AS value
from personnel
full outer join role_perms on role_perms.personnel_role_id = personnel.personnel_role_id
where personnel.user_id = NEW USER ID;
我正在尝试使用触发器复制此行为。我似乎无法让它发挥作用。这是我到目前为止的触发器:
CREATE OR REPLACE TRIGGER create_perms_on_create_user
BEFORE INSERT
ON users
FOR EACH ROW
DECLARE
v_user_id number(25);
BEGIN
-- Find user_id of the record being inserted into the table
SELECT :NEW.user_id INTO v_user_id
FROM users;
-- Insert records into user_perms table
insert into user_perms
(user_id,
perm_id,
value)
select personnel.user_id AS user_id,
role_perms.perm_id AS perm_id,
role_perms.value AS value
from personnel
full outer join role_perms
on role_perms.personnel_role_id = personnel.personnel_role_id
where user_id = v_user_id;
END;
/
现在我收到了这个错误。
ORA-01422:精确提取返回超过请求的行数
我认为它最初可能会作为后插入工作,但是没有用,所以我之前尝试过。我现在不确定接下来会尝试什么。任何帮助,将不胜感激。
答案 0 :(得分:1)
您正在尝试为每个用户添加:NEW.user_id INTO v_user_id
。这就是为什么多个结果错误。而只是使用查询中的值。
insert into user_perms
(user_id, perm_id, value)
select :NEW.user_id AS user_id,
role_perms.perm_id AS perm_id,
role_perms.value AS value
from personnel
full outer join role_perms
on role_perms.personnel_role_id = personnel.personnel_role_id
where user_id = :NEW.user_id ;
注意:请注意触发器的顺序,因为这是在UDPATE之前。所以也许数据还没有。