天天看點

postgresql 删除觸發器_PostgreSQL資料庫觸發器簡介

閱讀:

4,171

PostgreSQL資料庫觸發器是在PostgreSQL資料庫中經常會遇到的,在本篇文章中,我将簡單的介紹下觸發器,并用一個父子表的例子示範編寫觸發器的過程。

PostgreSQL資料庫觸發器簡介

在這一部分中,我将簡單介紹PostgreSQL資料庫觸發器和觸發器函數,以及觸發器涉及到的一些sql。

1.1 觸發器

PostgreSQL資料庫觸發器按照官方的定義就是:A trigger is a specification that the database should automatically execute a particular function whenever a certain type of operation is performed,

其中可以了解為資料庫自動執行或指定的資料庫事件發生時調用的回調函數。它既可以綁定在資料庫表上,也可以綁定在資料庫視圖上。

建立觸發器的基本文法如下圖所示,其中event可以為 INSERT、UPDATE、DELETE、TRUNCATE中的一個。

postgresql 删除觸發器_PostgreSQL資料庫觸發器簡介

觸發器可以在指定觸發操作前(在檢查限制之前INSERT,UPDATE或DELETE)或操作完成後(在檢查限制之後和INSERT,UPDATE或DELETE已完成),或替代的操作(視圖上INSERT,UPDATE或DELETE)等情況下執行觸發器函數。

FOR EACH ROW觸發器被标記的操作修改的每一行被稱為一次;FOR EACH STATEMENT觸發器為隻執行一次對于任何給定的操作,不關心其修改多少行。

若有WHERE子句,則隻執行WHERE子句為TRUE的行;若無,則執行所有行。

同一張表或視圖上可以建立多個觸發器,觸發器調用的順序和觸發器的類型有關,其中表上各類觸發器調用順序如下所示:

 如果一張表或視圖上有多個同類觸發器,則按照觸發器名稱的排序進行調用,例如

1.2 觸發器函數

觸發器函數的官方定義就是:The trigger function must be defined before the trigger itself can be created. The trigger function must be declared as a function taking no arguments and returning type trigger. (The trigger function receives its input through a specially-passed TriggerData structure, not in the form of ordinary function arguments.),觸發器函數就是在建立觸發器時需要指定觸發器被觸發時執行的函數,它的傳回類型是trigger,其必須在建立觸發器之前定義。如果需要給觸發器函數傳入參數, 不能定義在觸發器函數的參數清單中, 而是通過其他方式傳入(TriggerData資料結構)。

定義一個觸發器函數的文法如下所示(觸發器函數中定義變量,指派和控制結構等部分參照第二部分中的例子):

postgresql 删除觸發器_PostgreSQL資料庫觸發器簡介

編寫觸發器函數的語言有多種,例如plpgsql、pltcl、plperl、plpython、C,使用plpgsql寫的觸發器函數, 通過變量TG_ARGV[]來接收傳入的變量值。

可以利用RAISE語句報告資訊和抛出錯誤,其聲明形式為:

postgresql 删除觸發器_PostgreSQL資料庫觸發器簡介

例如:

postgresql 删除觸發器_PostgreSQL資料庫觸發器簡介

同一個觸發器函數可以多次被觸發器調用。

在定義完觸發器函數後,就可以建立觸發器,使得觸發器函數被觸發器調用,并與資料庫表或者視圖綁定。

1.3 觸發器查詢和删除sql

查詢目前資料庫中所有觸發器:

查詢指定表上的觸發器名稱:

删除一個觸發器:

父子表結構

父子表是一種資料在插入到父表後,也會按照相應規則建立對應的子表,并插入到該張子表中的結構(假如父表是applog,2017年6月5日的日志在插入applog這張父表後,也會同時根據當天時間插入到applog_20170605這張子表中)。這種按天區分的父子表結構,可以在父表資料量很大的時候,通過查詢特定天的子表,避免查詢資料量大的表,進而提高查詢性能。

這種生成父子表的方式是通過編寫資料庫觸發器的方式實作的,下面我将實作一個類似父子表結構,用來介紹建立資料庫觸發器的過程。假如父表是一張表ip_number,其中存儲各個ip出現的次數,在插入資料到父表的同時需要按照該ip出現的次數分别建立ip_number_thousand、ip_number_thousand_million、ip_number _million三張子表,并将資料插入到對應次數區間的子表中。

2.1 建立父表結構

建立如下圖的父表結構:其中假設限定number的最大次數是1000000000。

postgresql 删除觸發器_PostgreSQL資料庫觸發器簡介

2.2 建立觸發器函數(plpgsql編寫實作觸發器函數)

(1)觸發器函數中變量聲明和子表區間邊界值指派

postgresql 删除觸發器_PostgreSQL資料庫觸發器簡介

(2)子表名稱指派和檢查子表是否存在

postgresql 删除觸發器_PostgreSQL資料庫觸發器簡介

(3)若子表不存在,建立子表和RULE

postgresql 删除觸發器_PostgreSQL資料庫觸發器簡介

觸發器函數會在往父表插入資料時執行,生成子表,并建立規則。進而使得往父表插入資料時,自動建立對應區間的子表,并也将資料插入到對應的子表中。

2.3 建立觸發器

建立觸發器,向父表中插入資料時執行觸發器函數。

postgresql 删除觸發器_PostgreSQL資料庫觸發器簡介

最後父表結構如下圖所示:

postgresql 删除觸發器_PostgreSQL資料庫觸發器簡介

sql查詢ip_number表上的觸發器和觸發器詳情:

postgresql 删除觸發器_PostgreSQL資料庫觸發器簡介

2.4 測試

在測試中,分别向父表中插入number 為100,10000,10000000的三條資料。

postgresql 删除觸發器_PostgreSQL資料庫觸發器簡介

通過觀察父表ip_number,可以看出觸發器和規則均已生效。

postgresql 删除觸發器_PostgreSQL資料庫觸發器簡介

三種類型的子表成功自動建立,并已插入資料。

postgresql 删除觸發器_PostgreSQL資料庫觸發器簡介

按照以上方式可以實作PostgreSQL資料庫觸發器,并建立父子表結構。

對于以上的部分,如果有不正确或者更好的地方,希望大家幫忙指正。謝謝!

參考連接配接:http://www.postgresql.org/docs/9.2/static/plpgsql-trigger.html

http://www.postgresql.org/docs/9.2/static/trigger-definition.html

http://www.postgresql.org/docs/9.2/static/trigger-interface.html

http://www.php100.com/manual/PostgreSQL8/infoschema-tables.html