PostgreSQL觸發器


PostgreSQL觸發器是一組動作或資料庫回撥函式,它們在指定的表上執行指定的資料庫事件(即,INSERTUPDATEDELETETRUNCATE語句)時自動執行。 觸發器用於驗證輸入資料,執行業務規則,保持審計跟蹤等。

觸發器的重點知識

  1. PostgreSQL在以下情況下執行/呼叫觸發器:在嘗試操作之前(在檢查約束並嘗試INSERTUPDATEDELETE之前)。或者在操作完成後(在檢查約束並且INSERTUPDATEDELETE完成後)。或者不是操作(在檢視中INSERTUPDATEDELETE的情況下)

  2. 對於操作修改的每一行,都會呼叫一個標記為FOR EACH ROWS的觸發器。 另一方面,標記為FOR EACH STATEMENT的觸發器只對任何給定的操作執行一次,而不管它修改多少行。

  3. 您可以為同一事件定義同一型別的多個觸發器,但條件是按名稱按字母順序觸發。

  4. 當與它們相關聯的表被刪除時,觸發器被自動刪除。

PostgreSQL建立觸發器

CREATE TRIGGER語句用於在PostgreSQL表中建立一個新的觸發器。 當表發生特定事件(即INSERTUPDATEDELETE)時,它被啟用。

語法

CREATE  TRIGGER trigger_name [BEFORE|AFTER|INSTEAD OF] event_name  
ON table_name  
[  
 -- Trigger logic goes here....  
];

在這裡,event_name可以是INSERTUPDATEDELETETRUNCATE資料庫操作上提到的表table_name。 您可以選擇在表名後指定FOR EACH ROW

下面來看看看如何在INSERT操作中建立觸發器的語法。

CREATE  TRIGGER trigger_name AFTER INSERT ON column_name  
ON table_name  
[  
 -- Trigger logic goes here....  
];

觸發器例子

下面舉個例子來演示PostgreSQL在INSERT語句之後建立觸發器。在以下範例中,我們對每個記錄插入到COMPANY表中進行稽核(審計)。

使用以下查詢建立一個名為COMPANY的表:

CREATE TABLE COMPANY(  
   ID INT PRIMARY KEY     NOT NULL,  
   NAME           TEXT    NOT NULL,  
   AGE            INT     NOT NULL,  
   ADDRESS        CHAR(50),  
   SALARY         REAL  
);

為了儲存審計/稽核,我們將建立一個名為AUDIT的新表,只要在COMPANY表中有一個新記錄的條目,就會插入紀錄檔訊息。

使用以下查詢語句建立另一個表Audit

CREATE TABLE AUDIT(  
    EMP_ID INT NOT NULL,  
    ENTRY_DATE TEXT NOT NULL  
);

COMPANY表上建立觸發器之前,首先建立一個名為auditlogfunc()的函式/過程。

執行以下查詢語句來建立函式/過程:

CREATE OR REPLACE FUNCTION auditlogfunc() RETURNS TRIGGER AS $example_table$  
    BEGIN  
        INSERT INTO AUDIT(EMP_ID, ENTRY_DATE) VALUES (new.ID, current_timestamp);  
        RETURN NEW;   
    END;  
$example_table$ LANGUAGE plpgsql;

執行結果如下所示-

現在通過使用以下查詢語句在COMPANY表上建立一個觸發器:

CREATE TRIGGER example_trigger AFTER INSERT ON COMPANY  
FOR EACH ROW EXECUTE PROCEDURE auditlogfunc();

執行結果如下所示-

COMPANY表中插入一些資料記錄,以驗證觸發器執行情況。

INSERT INTO COMPANY VALUES(1, '小米科技', 8, '北京市朝陽區', 9999);
INSERT INTO COMPANY VALUES(2, '京東中科', 6, '廣州市天河區', 8999);

在執行上面兩條插入語句後,現我們來看AUDIT表是否有自動插入兩條稽核記錄。

可以確定的是在插入資料後觸發了觸發器,PostgreSQL也自動向AUDIT表中建立/插入兩個記錄。 這些記錄是觸發的結果,這是因為我們在AFTER INSERT on COMPANY表上建立了這些記錄。

PostgreSQL觸發器的使用

PostgreSQL觸發器可用於以下目的:

  • 驗證輸入資料。
  • 執行業務規則。
  • 為不同檔案中新插入的行生成唯一值。
  • 寫入其他檔案以進行審計跟蹤。
  • 從其他檔案查詢交叉參照目的。
  • 存取系統函式。
  • 將資料複製到不同的檔案以實現資料一致性。

使用觸發器的優點

  • 它提高了應用程式的開發速度。 因為資料庫儲存觸發器,所以您不必將觸發器操作編碼到每個資料庫應用程式中。
  • 全域性執法業務規則。定義觸發器一次,然後將其重用於使用資料庫的任何應用程式。
  • 更容易維護 如果業務策略發生變化,則只需更改相應的觸發程式,而不是每個應用程式。
  • 提高客戶/伺服器環境的效能。 所有規則在結果返回之前在伺服器中執行。