【问题标题】:Error on Trigger SQL Oracle触发 SQL Oracle 时出错
【发布时间】: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


【解决方案1】:

正如贾斯汀已经指出的那样,您的代码会生成一个无限循环,因为触发器会为每个插入语句触发,包括触发器内的语句。 一个可能的解决方案是:

CREATE OR REPLACE TRIGGER generatePassword
BEFORE INSERT ON people
FOR EACH ROW

BEGIN
:NEW.password := round(dbms_random.value(0000,9999);

END generatePassword;
/

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

【讨论】:

    猜你喜欢
    • 2014-04-07
    • 1970-01-01
    • 2017-03-12
    • 1970-01-01
    • 1970-01-01
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多