VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

DML 触发器的执行顺序

本节主要介绍 DML 触发器的执行顺序。

同一关系上触发器的触发顺序

如果为同一个关系上的同一事件定义了超过一个触发器,它们将按照其名称的字母表顺序被触发。

在 BEFORE 和 INSTEAD OF 触发器的情况下,每一个触发器返回的可能被修改的行将成为下一个触发器的输入。如果任何一个 BEFORE 或 INSTEAD OF 触发器返回 NULL,该操作将在该行上被禁用并且对于该行不会触发后续的触发器。

约束与触发器的顺序

在 Vastbase 数据库中,约束是在自定义触发器之前执行的。当进行插入、更新或删除操作时,约束先于触发器执行。

约束的执行顺序保证了数据的完整性和一致性。由于约束是在触发器之前执行的,这意味着如果数据不符合任何约束条件,触发器不会触发。

示例

1、创建示例表。

CREATE TABLE products (
  product_id SERIAL PRIMARY KEY,
  product_name VARCHAR(50) UNIQUE,
  product_count INTEGER
);

INSERT INTO products (product_name, product_count) VALUES ('apple', 3);
INSERT INTO products (product_name, product_count) VALUES ('banana', 2);

2、创建触发器函数。

CREATE OR REPLACE FUNCTION update_product_name_func() RETURNS TRIGGER AS
$$
BEGIN
  RAISE NOTICE 'Product name updated';
  RETURN NEW;
END
$$LANGUAGE PLPGSQL;

3、创建触发器,引用创建的触发器函数 update_product_name_func()。

CREATE TRIGGER tri_update_product_name
  AFTER UPDATE OF product_name ON products
  FOR EACH ROW
  EXECUTE PROCEDURE update_product_name_func();

4、验证约束和触发器执行顺序。

  • 插入违反唯一性约束的数据。

    INSERT INTO products (product_name, product_count) VALUES ('apple', 7);
    

    插入失败,触发器没有执行。

    ERROR: duplicate key value violate unique constraint "products_product_name_key"
    DETAIL: Key(product_name)=(apple) already exists.
    
  • 更新 product_name 列。

    UPDATE products SET product_name = 'peach' WHERE product_id = 1;
    

    返回结果如下,说明执行了触发器。

    Product name updated