PostgreSQL 触发器以避免列中的更新

标签 postgresql triggers

我有一个 PostgreSQL 数据库,其中有一个名为 product 的表。在此表中,我有一个名为 auxId 的自动增量列(不是表的主键)。我想避免对此专栏进行任何更新。如何使用 PostgreSQL 触发器完成此操作?

我试过:

CREATE OR REPLACE FUNCTION stop_change_on_auxId()
  RETURNS trigger AS
$BODY$
BEGIN
 IF NEW.auxId <> OLD.auxId THEN

 END IF;
 
 RETURN NEW;
END;
$BODY$

-- trigger to avoid updates on auxId
CREATE TRIGGER avoid_auxid_changes
  BEFORE UPDATE
  ON product
  FOR EACH ROW
  EXECUTE PROCEDURE stop_change_on_auxId();

但我相信这会停止整行的更新。我只需要避免对 auxId 字段进行更新,但允许对其行进行任何其他更新。

最佳答案

如果您基本上想让 auxid 列对外界不可变,您可以这样做:

CREATE OR REPLACE FUNCTION stop_change_on_auxId()
  RETURNS trigger AS
$BODY$
BEGIN
  -- always reset the auxId to the value already stored
  NEW.auxId := OLD.auxId;
  RETURN NEW;
END;
$BODY$


CREATE TRIGGER avoid_auxid_changes
  BEFORE UPDATE
  ON product
  FOR EACH ROW
  EXECUTE PROCEDURE stop_change_on_auxId();

关于PostgreSQL 触发器以避免列中的更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56082230/

相关文章:

MySQL写一个触发器,防止买太多

postgresql - 将二进制内容附加到 PostgreSQL 数据库中的 bytea 列

mysql触发ckeck约束

mysql - MySql 中的 TRIGGER 代替 CHECK 子句

sql-server-2008 - SQL Server 2008 - 触发器之前?

mysql - MySQL触发器中的多个if语句

sql - 间隔 : How can I make sure there is just one row with a null value in a timstamp column in table?

ruby-on-rails - Postgres + Heroku SSL SYSCALL 错误

postgresql - 将子查询结果列合并为一个列,然后在 ORDER BY 中使用

sql - SQuirreL : unterminated dollar-quoted string 中的 PostgreSQL 函数定义