【发布时间】:2016-09-18 09:08:28
【问题描述】:
您好,我在 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: 在 "UTF8.GENERATEPASSWORD", 第 2 行 ORA-04088: 执行触发器期间出错 'UTF8.GENERATEPASSWORD' ORA-06512:在“UTF8.GENERATEPASSWORD”,第 2 行 ORA-04088: 执行触发器时出错 '
这里有什么问题?
【问题讨论】:
-
你想完成什么?如果
people上的触发器尝试插入people,您将进入无限循环(初始插入触发触发器,该触发器插入一个新行,该行再次触发该触发器,该触发器插入一个新行,该行触发再次触发...)。如果您只是想从初始插入更改password值,您只需要:new.password := round(dbms_random.value(0000,9999);。 -
贾斯汀,你的意思是这样的吗:
create or replace trigger generatePassword before insert on people for each row begin :NEW.password = (select round(dbms_random.value(0000,9999)) from dual; 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,:NEW.password ); end; /
标签: sql database oracle oracle11g triggers