【问题标题】:Simple trigger combining TG_TABLE_NAME and now() SQL结合 TG_TABLE_NAME 和 now() SQL 的简单触发器
【发布时间】:2018-09-21 22:48:03
【问题描述】:

我想要一个触发函数来将<table_name>.date_updated 更新为now()。我在update 语句中使用TG_TABLE_NAME,因为我有很多表会调用这个触发器函数。但是 - 我错过了一些基本的东西,因为每当我尝试将 \copy 数据放入我的表时,我都会收到错误 relation "tg_table_name" does not exist

这是我的触发函数:

create or replace function table_updated() 
returns trigger as 
$body$
begin 
    update TG_TABLE_NAME
    set NEW.date_updated = now();
end
$body$
language plpgsql;

create trigger "updateDate"
before update or insert on <table_name>
for each row execute procedure table_updated();

我正在使用 Postgres 10.5 版。

如果我理解正确,我需要以某种方式实现execute,但我不确定如何实现。

【问题讨论】:

  • 我猜你需要动态 SQL 创建一个查询,将变量中的名称作为字符串,然后执行它。但您真的要更新每一行吗? UPDATE 查询中没有 WHERE。通常,更改或插入的行由触发器更改。但这可以通过NEW 记录来完成。
  • 你只是想设置NEW.date_updated = now()吗?看看这里的答案:stackoverflow.com/questions/16102188/…
  • 我在输入时完全忽略了添加NEW - 感谢您指出这一点!我希望做的是避免为每个表创建 15 个函数、15 个触发器——我宁愿有 1 个函数、15 个触发器。我只是不知道如何在函数中一般/动态地引用表触发器。

标签: sql postgresql database-trigger


【解决方案1】:

好的,这非常简单,但留给刚开始使用数据库的其他人,以防他们遇到同样的问题。您无需在函数中指定要更新的表,因为触发器已分配给所述表。它知道它正在引用/更新自己。

create or replace function table_updated() 
returns trigger as 
$body$
begin 
    new.date_updated = now();
    return new;
end
$body$
language plpgsql;

如果有人能比我更合乎逻辑地解释这一点,请随时纠正我!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-17
    • 2015-12-20
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    • 2020-09-08
    • 1970-01-01
    相关资源
    最近更新 更多