触发器SQL Oracle

时间:2016-05-21 01:08:05

标签: sql database oracle oracle11g triggers

我在SQL Oracle上创建触发器时遇到问题。

我的触发器是:

    create or replace trigger generatePassword
before insert on people
for each row
begin
    insert into people(nif,naame,date_birth,sex,adress,email,iban,password)
    values (:NEW.nif,:NEW.naame,:NEW.date_birth,:NEW.sex,:NEW.adress,:NEW.email,:NEW.iban,(select round(dbms_random.value(0000,9999)) from dual));
end;
/

触发器已成功创建。然后,当我尝试运行命令时:

insert into people (naame, date_birth, sex, adress, email, iban, nif, id) values ('Albert', '01-12-87', 'M', 'NY', 'albert@gmail.com', '000032134537512343231', '523456189', '70');

我收到此错误:

  

ORA-00036:超出了最大递归SQL级别数(50)   ORA-06512:在“UTF8.GENERATEPASSWORD”,第2行ORA-04088:错误期间   执行触发器'UTF8.GENERATEPASSWORD'ORA-06512:at   “UTF8.GENERATEPASSWORD”,第2行ORA-04088:执行期间出错   触发'UTF8.GENERATEPASSWORD'ORA-06512:at“UTF8.GENERATEPASSWORD”,   第2行ORA-04088:执行触发期间出错   'UTF8.GENERATEPASSWORD'ORA-06512:在“UTF8.GENERATEPASSWORD”,第2行   ORA-04088:执行触发器'

时出错

这里有什么问题?

1 个答案:

答案 0 :(得分:1)

正如Justin已经指出的那样,你的代码会生成一个无限循环,因为触发器会触发包含触发器内的每个insert语句的触发器。 一个可能的解决方案是:

-

每当触发器触发时,都会生成一个密码并将其添加到原始插入语句中。