PostgreSQL 更改触发器

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

摘要:在本教程中,您将学习如何使用 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 是大写的。

更换触发器

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

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

以下示例说明如何 check_salary 将 salary_before_update 触发器的功能更改为 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 TRIGGER and CREATE TRIGGER 语句对将触发器替换为新触发器。