PostgreSQL 教程: ALTER TRIGGER 更改触发器

九月 9, 2023

摘要:在本教程中,您将学习如何使用 PostgreSQL 的ALTER TRIGGER语句来重命名触发器。

PostgreSQL ALTER TRIGGER 语句简介

ALTER TRIGGER语句允许您重命名触发器。下面显示了ALTER TRIGGER语句的语法:

ALTER TRIGGER trigger_name
ON table_name 
RENAME TO new_trigger_name;

在这个语法中:

  • 首先,在ALTER TRIGGER关键字后指定要重命名的触发器的名称。
  • 其次,在ON关键字后指定与触发器关联的表的名称。
  • 第三,在RENAME TO关键字后指定触发器的新名称。

PostgreSQL ALTER TRIGGER 示例

首先,创建一个新表,名为employees

DROP TABLE IF EXISTS employees;

CREATE TABLE employees(
   employee_id INT GENERATED ALWAYS AS IDENTITY,
   first_name VARCHAR(50) NOT NULL,
   last_name VARCHAR(50) NOT NULL,
   salary decimal(11,2) not null default 0,
   PRIMARY KEY(employee_id)
);

其次,创建一个函数,如果新工资超出旧工资 100%,则引发异常:

CREATE OR REPLACE FUNCTION check_salary()
  RETURNS TRIGGER 
  LANGUAGE PLPGSQL  
  AS
$$
BEGIN
	IF (NEW.salary - OLD.salary) / OLD.salary >= 1 THEN
		RAISE 'The salary increment cannot that high.';
	END IF;

	RETURN NEW;
END;
$$

第三,创建一个更新前触发器(BEFORE UPDATE),在更新工资之前执行check_salary()函数。

CREATE TRIGGER before_update_salary
  BEFORE UPDATE
  ON employees
  FOR EACH ROW
  EXECUTE PROCEDURE check_salary();

第四步,向employees表中插入新行

INSERT INTO employees(first_name, last_name, salary)
VALUES('John','Doe',100000);

第五步,更新 ID 为 1 的员工的工资:

UPDATE employees
SET salary = 200000
WHERE employee_id = 1;

触发器被触发并发出以下错误:

ERROR:  The salary increment cannot that high.
CONTEXT:  PL/pgSQL function check_salary() line 4 at RAISE
SQL state: P0001

它按预期工作。

最后,使用ALTER TRIGGER语句将before_update_salary触发器重命名为salary_before_update

ALTER TRIGGER before_update_salary
ON employees
RENAME TO salary_before_update;

如果您使用 psql 工具,您可以使用\dS命令查看与表关联的所有触发器:

 \dS employees

请注意,其中的字母S是大写的。

img

重写触发器

PostgreSQL 不支持允许您修改触发器定义的OR REPLACE语句,例如修改触发器触发时将执行的函数。

为此,您可以使用DROP TRIGGERCREATE TRIGGER语句。您还可以将这些语句包装在事务中。

下面的例子说明了如何将salary_before_update触发器的check_salary函数更改为validate_salary

BEGIN;

DROP TRIGGER IF EXISTS salary_before_update;

CREATE TRIGGER salary_before_udpate
  BEFORE UPDATE
  ON employees
  FOR EACH ROW
  EXECUTE PROCEDURE validate_salary();

COMMIT;

概括

  • 使用ALTER TRIGGER语句重命名触发器。

  • 使用DROP TRIGGERCREATE TRIGGER语句将触发器替换为新触发器。