Oracle上插入触发器

时间:2017-10-30 21:04:04

标签: oracle triggers

每当我将记录添加到不同的表时,我都会写一个触发器来更新表。基本上,我有一个用户记录表。每当我向该表添加记录时,我都希望触发器为该新用户创建一些权限。有一个表具有存储在其中的所有用户角色和相关权限。创建新权限的方法是使用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:精确提取返回超过请求的行数

我认为它最初可能会作为后插入工作,但是没有用,所以我之前尝试过。我现在不确定接下来会尝试什么。任何帮助,将不胜感激。

1 个答案:

答案 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之前。所以也许数据还没有。