PostgreSQL-觸發器


一、觸發器概述

  • 觸發器是一種由事件自動觸發執行的特殊存儲過程,這些事件可以是對一個表進行 INSERT、UPDATE、DELETE 等操作
  • 觸發器經常用於加強數據的完整性約束和業務規則上的約束等

二、創建觸發器的步驟

  • 先為觸發器建一個執行函數,函數的返回類型為觸發器類型trigger,然后即可創建相應的觸發器
  • 例如當刪除學生表(student)中的一條記錄時,把這個學生在成績表 (score) 中的成績記錄也刪除掉,這時就可以使用觸發器

三、觸發器函數

create function sentence_insert() returns trigger
as
$$
BEGIN
    IF (new.id > 4000) THEN
        insert into tbl_sentence_log(content) values (session_user);
        return new;
    ELSEIF (new.id < 4000) THEN
        RAISE EXCEPTION 'command % is disabled', now();
    END IF;
END
$$
language plpgsql;

四、創建觸發器

1)觸發器語法

CREATE [OR REPLACE] TRIGGER TRIGGER_NAME
{BEFORE | AFTER} TRIGGER_EVENT
ON TABLE_NAME
[FOR EACH ROW]
[WHEN TRIGGER_CONDITION]
TRIGGER_BODY

語法解釋:
TRIGGER_NAME  觸發器名稱
BEFORE | AFTER  指定觸發器是在觸發事件發生之前觸發或者發生之后觸發
TRIGGER_EVENT 觸發事件,在DML觸發器中主要為INSERT、UPDATE、DELETE等
TABLE_NAME  表名,表示發生觸發器作用的對象
FOR EACH ROW  指定創建的是行級觸發器,若沒有該子句則創建的是語句級觸發器
WHEN TRIGGER_CONDITION  添加的觸發條件
TRIGGER_BODY  觸發體,是標准的PL/SQL語句塊

2)創建觸發器示例

CREATE TRIGGER INSERT_TRIGGER
AFTER INSERT ON TBL_SENTENCE
FOR EACH ROW
EXECUTE PROCEDURE SENTENCE_INSERT();

五、語句級觸發器與行級觸發器

  • 語句級的觸發器是指執行每個 SQL 時,只執行一次,行級觸發器則指每行都會執行一次。
  • 一個修改零行的操作會導致合適的語句級觸發器被執行,但不會觸發行級觸發器。
  • 批量插入時,語句級別的觸發器只觸發一次,不管 affected row 是否為 0,但是行級觸發器的觸發次數為 affected row。

六、BEFORE 觸發器與 AFTER 觸發器

  • 語句級別的 BEFORE 觸發器是在語句開始做任何事情之前就被觸發了,而語句級別的 AFTER 觸發器是在語句結束時才觸發的。
  • 行級別的 BEFORE 觸發器在對特定行進行操作之前觸發,而行級別的 AFTER 觸發器是在語句結束時才觸發的,但是它會在任何語句級別的 AFTER 觸發器被觸發之前觸發。

七、觸發器函數中的特殊變量

當把一個 PL/pgSQL 函數當作觸發器函數調用的時候,系統會在頂層的聲明段里自動創建幾個特殊變量,
比如在之前例子中的 “NEW”、“OLD”、“TG_OP” 變量等。可以使用的變量有如下這些。
NEW:該變量為
INSERT/UPDATE 操作觸發的行級觸發器中存儲的新的數據行,數據類型是 RECORD。 在語句級別的觸發器里此變量沒有分配,DELETE 操作觸發的行級觸發器中此變量也沒有分配。
OLD:該變量為
UPDATE/DELETE 操作觸發的行級觸發器中存儲的舊數據行,數據類型是 RECORD。 在語句級別的觸發器里此變量沒有分配, INSERT 操作觸發的行級觸發器中此變量也沒有分配。
TG_NAME:數據類型是 name,該變量包含實際觸發的觸發器名。
TG_WHEN: 內容為 BEFORE 或 AFTER 的字符串,用於指定是 BEFORE 觸發器還是 AFTER 觸發器。
TG_LEVEL: 內容為 ROW 或 STATEMENT 的字符串用於指定是語句級觸發器還是行級觸發器。
TG_OP: 內容為
INSERTUPDATEDELETETRUNCATE 之一的字符串,用於指定 DML 語句的類型。
TG_RELID: 觸發器所在表的 OID。
TG_TABLE_NAME: 觸發器所在表的名稱。
TG_TABLE_SCHEMA: 觸發器所在表的模式。
TG_NARGS: 在
CREATE TRIGGER 語句里面賦予觸發器過程的參數個數。
TG_ARGV
[]: 為 text 類型的一個數組;是 CREATE TRIGGER 語句里的參數。

八、刪除觸發器函數

DROP FUNCTION sentence_insert()

九、刪除觸發器

DROP TRIGGER IF EXISTS 觸發器名稱 ON 表名稱;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM