【问题标题】:How can I solve max_stack_depth?如何解决 max_stack_depth?
【发布时间】:2020-12-04 19:35:05
【问题描述】:

我是 PGADMIN 的超级新手,但我遇到了问题。 每次在邮件或数据库中表的用户名中检测到更改时,我都必须创建一个触发器,将密码更新为“123456”并将重置标记更新为“Y”。 我的代码是:

CREATE OR REPLACE FUNCTION password_reset()
RETURNS trigger AS $$
BEGIN 
    UPDATE web_content.tb_user SET user_password = '123456' 
    WHERE user_email = NEW.user_email OR user_name = NEW.user_name;
    UPDATE web_content.tb_user SET password_reset = 'Y'
    WHERE user_email = NEW.user_email OR user_name = NEW.user_name;
RETURN NEW;
END
$$ LANGUAGE plpgsql;

CREATE TRIGGER TR_update BEFORE update on web_content.tb_user
for each row
execute procedure password_reset();

当我尝试对我的表进行更新时,出现错误错误 max_stack_depth。我不知道如何解决它。 谁能帮帮我?

提前致谢

【问题讨论】:

  • Laurenz 已经向您展示了 UPDATE 是不必要的。但即使不是,您也只需要 一个 UPDATE 语句,而不是两个。您可以使用单个语句更新多个列。您不需要为要更改的每一列运行一个

标签: sql postgresql triggers sql-update


【解决方案1】:

不要更新触发器函数中的表。这会生成一个无限循环,其中函数的 update 语句再次触发触发器,并最终引发您遇到的错误。

相反,您可以在表中更新新行之前直接在函数中设置新值。如果您只想在修改某些特定列时触发触发器,您可以在触发器定义中使用when 子句。

create or replace function password_reset()
returns trigger as $$
begin 
    new.user_password = '123456';
    new.password_reset = 'Y';
    return new;
end
$$ language plpgsql;

create trigger tr_update before update on web_content.tb_user
for each row
when (old.email is distinct from new.email or old.username is distinct from new.username)
execute procedure password_reset();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 2018-06-01
    • 1970-01-01
    • 2022-10-26
    • 2019-05-10
    相关资源
    最近更新 更多