欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

PostgreSql觸發(fā)器創(chuàng)建、使用以及刪除示例詳解

 更新時(shí)間:2024年03月08日 11:06:59   作者:腦子進(jìn)水養(yǎng)啥魚?  
在PostgreSQL中觸發(fā)器函數(shù)是一個(gè)沒有參數(shù)并且返回trigger類型的函數(shù),這篇文章主要給大家介紹了關(guān)于PostgreSql觸發(fā)器創(chuàng)建、使用以及刪除的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下

一、概述

觸發(fā)器(Trigger)是由事件自動(dòng)觸發(fā)執(zhí)行的一種特殊的存儲(chǔ)過程,觸發(fā)事件可以是對(duì)一個(gè)表進(jìn)行INSERT、UPDATE、DELETE等操作。觸發(fā)器經(jīng)常用于加強(qiáng)數(shù)據(jù)的完整性約束和業(yè)務(wù)規(guī)則上的約束等。

二、創(chuàng)建觸發(fā)器

2.1 語法

CREATE [ CONSTRAINT ] TRIGGER name { BEFORE | AFTER | INSTEAD OF } { event [ OR ... ] }
    ON table_name
    [ FROM referenced_table_name ]
    [ NOT DEFERRABLE | [ DEFERRABLE ] [ INITIALLY IMMEDIATE | INITIALLY DEFERRED ] ]
    [ REFERENCING { { OLD | NEW } TABLE [ AS ] transition_relation_name } [ ... ] ]
    [ FOR [ EACH ] { ROW | STATEMENT } ]
    [ WHEN ( condition ) ]
    EXECUTE { FUNCTION | PROCEDURE } function_name ( arguments )

這里的event可以是下列之一:

    INSERT
    UPDATE [ OF column_name [, ... ] ]
    DELETE
    TRUNCATE

參數(shù)說明:

name:觸發(fā)器的名稱。這必須與同一個(gè)表上的任何其他觸發(fā)器相區(qū)別。名稱不能是模式限定的,該觸發(fā)器會(huì)繼承它所在表的模式。
BEFORE|AFTER|INSTEAD OF:決定該函數(shù)是要在事件之前、之后被調(diào)用還是會(huì)取代該事件。
event:INSERT、UPDATE、DELETE 或者 TRUNCATE 之一,這指定了將要引發(fā)該觸發(fā)器的事件。多個(gè)事件可以用 OR 指定,要求傳遞關(guān)系的時(shí)候除外。

對(duì)于 UPDATE 事件,可以使用下面的語法指定一個(gè)列的列表:

 UPDATE OF column_name1 [, column_name2 ... ]

table_name:要使用該觸發(fā)器的表、視圖或外部表的名稱(可能是模式限定的)。
referenced_table_name:約束引用的另一個(gè)表的名稱(可能是模式限定的)。這個(gè)選項(xiàng)被用于外鍵約束并且不推薦用于一般的目的。這只能為約束觸發(fā)器指定。
NOT DEFERRABLE|[ DEFERRABLE ][ INITIALLY IMMEDIATE|INITIALLY DEFERRED]:該觸發(fā)器的默認(rèn)時(shí)機(jī)。這只能為約束觸發(fā)器指定。
REFERENCING:這個(gè)關(guān)鍵詞緊接在一個(gè)或者兩個(gè)關(guān)系名的聲明之前,這些關(guān)系提供對(duì)觸發(fā)語句的傳遞關(guān)系的訪問。
OLD TABLE|NEW TABLE:這個(gè)子句指示接下來的關(guān)系名是用于前映像傳遞關(guān)系還是后映像傳遞關(guān)系。
transition_relation_name:在該觸發(fā)器中這個(gè)傳遞關(guān)系要使用的(未限定)名稱。
FOR EACH ROW|FOR EACH STATEMENT:這指定該觸發(fā)器函數(shù)是應(yīng)該為該觸發(fā)器事件影響的每一行被引發(fā)一次,還是只為每個(gè) SQL 語句被引發(fā)一次。如果都沒有被指定,F(xiàn)OR EACH STATEMENT 會(huì)是默認(rèn)值。約束觸發(fā)器只能被指定為 FOR EACH ROW。
condition:一個(gè)決定該觸發(fā)器函數(shù)是否將被實(shí)際執(zhí)行的布爾表達(dá)式。如果指定了 WHEN,只有condition 返回 true 時(shí)才會(huì)調(diào)用該函數(shù)。在 FOR EACH ROW 觸發(fā)器中,WHEN 條件可以分別寫 OLD.column_name 或者 NEW.column_name 來引用列的新舊行值。當(dāng)然,INSERT 觸發(fā)器不能引用 OLD 并且 DELETE 觸發(fā)器不能引用 NEW。 INSTEAD OF 觸發(fā)器不支持 WHEN 條件。當(dāng)前,WHEN 表達(dá)式不能包含子查詢。
FUNCTION_NAME:一個(gè)用戶提供的函數(shù),它被聲明為不用參數(shù)并且返回類型 trigger,當(dāng)觸發(fā)器引發(fā)時(shí)會(huì)執(zhí)行該函數(shù)。在 CREATE TRIGGER 的語法中,關(guān)鍵詞 FUNCTION 和 PROCEDURE 是等效的,但是任何情況下被引用的函數(shù)必須是一個(gè)函數(shù)而不是過程。這里,關(guān)鍵詞 PROCEDURE 的使用是有歷史原因的并且已經(jīng)被廢棄。
arguments:一個(gè)可選的逗號(hào)分隔的參數(shù)列表,它在該觸發(fā)器被執(zhí)行時(shí)會(huì)被提供給該函數(shù)。參數(shù)是字符串常量。簡單的名稱和數(shù)字常量也可以被寫在這里,但是它們將全部被轉(zhuǎn)換成字符串。請(qǐng)檢查該觸發(fā)器函數(shù)的實(shí)現(xiàn)語言的描述來找出在函數(shù)內(nèi)部如何訪問這些參數(shù),這可能與普通函數(shù)參數(shù)不同。

2.2 示例

需先為觸發(fā)器創(chuàng)建一個(gè)執(zhí)行函數(shù),此函數(shù)返回的類型為觸發(fā)器類型。然后創(chuàng)建一個(gè)觸發(fā)器。如有一張學(xué)生表(student表)和一張學(xué)生的考試成績表(score表),想要在刪除學(xué)生記錄的同時(shí),刪除該學(xué)生的成績,可使用觸發(fā)器實(shí)現(xiàn)。

--創(chuàng)建學(xué)生表
CREATE TABLE student(
student_no int primary key,
student_name varchar(40),
age int
);

--創(chuàng)建成績表
CREATE TABLE score (
student_no int,
chinese_score int,
math_score int,
test_date date
);

--創(chuàng)建觸發(fā)器執(zhí)行函數(shù)
CREATE OR REPLACE FUNCTION student_delete_trigger()
RETURNS TRIGGER AS $$
BEGIN
DELETE FROM score WHERE student_no = OLD.student_no;
RETURN OLD;
END;
$$
LANGUAGE plpgsql;

--創(chuàng)建觸發(fā)器
CREATE TRIGGER delete_student_trigger
AFTER DELETE ON student
FOR EACH ROW EXECUTE PROCEDURE student_delete_trigger
();

--插入測試數(shù)據(jù)
INSERT INTO student VALUES(1, '張三', 14);
INSERT INTO student VALUES(2, '李四', 13);
INSERT INTO student VALUES(3, '王二', 15);
INSERT INTO score VALUES(1, 85, 75, date '2013-05-23');
INSERT INTO score VALUES(1, 80, 73, date '2013-09-18');
INSERT INTO score VALUES(2, 68, 83, date '2013-05-23');
INSERT INTO score VALUES(2, 73, 85, date '2013-09-18');
INSERT INTO score VALUES(3, 72, 79, date '2013-05-23');
INSERT INTO score VALUES(3, 78, 82, date '2013-05-23');

--刪除數(shù)據(jù)測試驗(yàn)證觸發(fā)器是否生效
postgres=# select * from student;
 student_no | student_name | age
------------+--------------+-----
          1 | 張三         |  14
          2 | 李四         |  13
          3 | 王二         |  15
(3 rows)

postgres=# select * from score;
 student_no | chinese_score | math_score | test_date
------------+---------------+------------+------------
          1 |            85 |         75 | 2013-05-23
          1 |            80 |         73 | 2013-09-18
          2 |            68 |         83 | 2013-05-23
          2 |            73 |         85 | 2013-09-18
          3 |            72 |         79 | 2013-05-23
          3 |            78 |         82 | 2013-05-23
(6 rows)

postgres=# DELETE FROM student where student_no = 3;
DELETE 1
postgres=# select * from student;
 student_no | student_name | age
------------+--------------+-----
          1 | 張三         |  14
          2 | 李四         |  13
(2 rows)

postgres=# select * from score;
 student_no | chinese_score | math_score | test_date
------------+---------------+------------+------------
          1 |            85 |         75 | 2013-05-23
          1 |            80 |         73 | 2013-09-18
          2 |            68 |         83 | 2013-05-23
          2 |            73 |         85 | 2013-09-18
(4 rows)

三、語句級(jí)觸發(fā)器與行級(jí)觸發(fā)器

一個(gè)被標(biāo)記為 FOR EACH ROW 的觸發(fā)器被稱為行級(jí)觸發(fā)器,會(huì)對(duì)該操作修改的每一行都調(diào)用一次。例如,一個(gè)影響 10 行的 DELETE 將導(dǎo)致在目標(biāo)關(guān)系上的任何 ON DELETE 觸發(fā)器被獨(dú)立調(diào)用 10 次。與此相反,一個(gè)被標(biāo)記為 FOR EACH STATEMENT 的觸發(fā)器被稱為語句級(jí)觸發(fā)器,只會(huì)為任何給定的操作執(zhí)行一次,不管該操作修改多少行(特別地,一個(gè)修改零行的操作將仍會(huì)導(dǎo)致任何可用的 FOR EACH STATEMENT 觸發(fā)器被執(zhí)行)。

3.1 語句級(jí)觸發(fā)器示例

對(duì) student 表的更新情況進(jìn)行記錄。

--創(chuàng)建日志記錄表
CREATE TABLE log_student(
update_time timestamp, --操作的時(shí)間
db_user varchar(40), --操作的數(shù)據(jù)庫用戶名
opr_type varchar(6) --操作類型:insert、delete、update
);

--創(chuàng)建觸發(fā)器函數(shù)(TG_OP 是觸發(fā)器函數(shù)中的特殊變量,代表 DML 操作類型)
CREATE FUNCTION log_student_trigger ()
RETURNS trigger AS
$$
BEGIN
INSERT INTO log_student values(now(), user, TG_OP);
RETURN NULL;
END;
$$
LANGUAGE "plpgsql";

--創(chuàng)建語句級(jí)觸發(fā)器
CREATE TRIGGER log_student_trigger
AFTER INSERT OR DELETE OR UPDATE ON student
FOR STATEMENT EXECUTE PROCEDURE log_student_trigger ();

--插入數(shù)據(jù),驗(yàn)證觸發(fā)器生效情況
postgres=# select * from student;
 student_no | student_name | age
------------+--------------+-----
(0 rows)

postgres=# select * from log_student;
 update_time | db_user | opr_type
-------------+---------+----------
(0 rows)

postgres=# INSERT INTO student VALUES(1, '張三', 14), (2, '李四', 14);
INSERT 0 2
postgres=# select * from student;
 student_no | student_name | age
------------+--------------+-----
          1 | 張三         |  14
          2 | 李四         |  14
(2 rows)

postgres=# select * from log_student;
        update_time         | db_user  | opr_type
----------------------------+----------+----------
 2023-07-11 09:55:06.990726 | postgres | INSERT
(1 row)

postgres=# UPDATE student SET age = 15;
UPDATE 2
postgres=# select * from student;
 student_no | student_name | age
------------+--------------+-----
          1 | 張三         |  15
          2 | 李四         |  15
(2 rows)

postgres=# select * from log_student;
        update_time         | db_user  | opr_type
----------------------------+----------+----------
 2023-07-11 09:55:06.990726 | postgres | INSERT
 2023-07-11 09:55:22.535921 | postgres | UPDATE
(2 rows)

postgres=# UPDATE student SET age = 16 WHERE student_no = 3;
UPDATE 0
postgres=# select * from log_student;
        update_time         | db_user  | opr_type
----------------------------+----------+----------
 2023-07-11 09:55:06.990726 | postgres | INSERT
 2023-07-11 09:55:22.535921 | postgres | UPDATE
 2023-07-11 09:56:39.129029 | postgres | UPDATE
(3 rows)

上述示例中可看到,student 表插入更新兩行數(shù)據(jù),log_student 中均記錄對(duì)應(yīng)操作的一條數(shù)據(jù),執(zhí)行了更新語句,但沒有更新數(shù)據(jù),也會(huì)觸發(fā)一條記錄日志操作。說明語句觸發(fā)器是按語句進(jìn)行觸發(fā)的,而不管這條語句實(shí)際操作了多少行數(shù)據(jù)。

3.2 行級(jí)觸發(fā)器示例

對(duì) student 表的更新情況進(jìn)行記錄。

--創(chuàng)建日志記錄表
CREATE TABLE log_student(
update_time timestamp, --操作的時(shí)間
db_user varchar(40), --操作的數(shù)據(jù)庫用戶名
opr_type varchar(6) --操作類型:insert、delete、update
);

--創(chuàng)建觸發(fā)器函數(shù)(TG_OP 是觸發(fā)器函數(shù)中的特殊變量,代表 DML 操作類型)
CREATE FUNCTION log_student_trigger ()
RETURNS trigger AS
$$
BEGIN
INSERT INTO log_student values(now(), user, TG_OP);
RETURN NULL;
END;
$$
LANGUAGE "plpgsql";

--創(chuàng)建行級(jí)觸發(fā)器
CREATE TRIGGER log_student_trigger2
AFTER INSERT OR DELETE OR UPDATE ON student
FOR ROW EXECUTE PROCEDURE log_student_trigger ();

--插入數(shù)據(jù),驗(yàn)證觸發(fā)器生效情況
postgres=# select * from student;
 student_no | student_name | age
------------+--------------+-----
(0 rows)

postgres=# select * from log_student;
 update_time | db_user | opr_type
-------------+---------+----------
(0 rows)

postgres=# INSERT INTO student VALUES(1, '張三', 14), (2, '李四', 14);
INSERT 0 2
postgres=# select * from student;
 student_no | student_name | age
------------+--------------+-----
          1 | 張三         |  14
          2 | 李四         |  14
(2 rows)

postgres=# select * from log_student;
        update_time         | db_user  | opr_type
----------------------------+----------+----------
 2023-07-11 10:00:08.608556 | postgres | INSERT
 2023-07-11 10:00:08.608556 | postgres | INSERT
(2 rows)

postgres=# UPDATE student SET age = 15;
UPDATE 2
postgres=# select * from student;
 student_no | student_name | age
------------+--------------+-----
          1 | 張三         |  15
          2 | 李四         |  15
(2 rows)

postgres=# select * from log_student;
        update_time         | db_user  | opr_type
----------------------------+----------+----------
 2023-07-11 10:00:08.608556 | postgres | INSERT
 2023-07-11 10:00:08.608556 | postgres | INSERT
 2023-07-11 10:00:22.382645 | postgres | UPDATE
 2023-07-11 10:00:22.382645 | postgres | UPDATE
(4 rows)

postgres=# UPDATE student SET age = 16 WHERE student_no = 3;
UPDATE 0
postgres=# select * from log_student;
        update_time         | db_user  | opr_type
----------------------------+----------+----------
 2023-07-11 10:00:08.608556 | postgres | INSERT
 2023-07-11 10:00:08.608556 | postgres | INSERT
 2023-07-11 10:00:22.382645 | postgres | UPDATE
 2023-07-11 10:00:22.382645 | postgres | UPDATE
(4 rows)

上述示例中可看到,student 表插入更新兩行數(shù)據(jù),log_student 中均記錄對(duì)應(yīng)條數(shù)的數(shù)據(jù),更新操作沒有更新實(shí)際行時(shí),不觸發(fā)記錄日志。說明行級(jí)觸發(fā)器是按影響行數(shù)進(jìn)行觸發(fā)的。

四、BEFORE 觸發(fā)器與 AFTER 觸發(fā)器

通常來說,語句級(jí)別的 BEFORE 觸發(fā)器是在語句開始做任何事情之前就被觸發(fā)了的,而語句級(jí)別的 AFTER 觸發(fā)器是在語句結(jié)束時(shí)才觸發(fā)的。行級(jí)別的 BEFORE 觸發(fā)器是在對(duì)特定行進(jìn)行操作之前觸發(fā)的,而行級(jí)別的 AFTER 觸發(fā)器是在語句結(jié)束時(shí)才觸發(fā)的,但是它會(huì)在任何語句級(jí)別的 AFTER 觸發(fā)器之前觸發(fā)。

4.1 BEFORE 觸發(fā)器示例

BEFORE 觸發(fā)器可以直接修改 NEW 值以改變實(shí)際的更新值,具體示例如下:

--創(chuàng)建觸發(fā)器函數(shù)
CREATE FUNCTION student_use_new_name_tirgger ()
RETURNS trigger AS '
BEGIN
NEW.student_name = NEW.student_name||NEW.student_no;
RETURN NEW;
END;'
LANGUAGE "plpgsql";

--創(chuàng)建觸發(fā)器
CREATE TRIGGER user_new_name_student_trigger
BEFORE INSERT OR UPDATE ON student
FOR EACH ROW EXECUTE PROCEDURE
student_use_new_name_tirgger ();

--插入數(shù)據(jù)驗(yàn)證觸發(fā)器生效情況
postgres=# select * from student;
 student_no | student_name | age
------------+--------------+-----
(0 rows)

postgres=# INSERT INTO student values(3,'王二', 15);
INSERT 0 1
postgres=# select * from student;
 student_no | student_name | age
------------+--------------+-----
          3 | 王二3        |  15
(1 row)

4.2 AFTER 觸發(fā)器示例

如果使用 AFTER 觸發(fā)器,則修改NEW是沒有意義的,示例如下:

postgres=# DROP TRIGGER user_new_name_student_trigger ON student;
DROP TRIGGER
postgres=# delete from student;
DELETE 1
postgres=# CREATE TRIGGER user_new_name_student_trigger
postgres-# AFTER INSERT OR UPDATE ON student
postgres-# FOR EACH ROW EXECUTE PROCEDURE
postgres-# student_use_new_name_tirgger ();
CREATE TRIGGER
postgres=# select * from student;
 student_no | student_name | age
------------+--------------+-----
(0 rows)

postgres=# INSERT INTO student values(3,'王二', 15);
INSERT 0 1
postgres=# select * from student;
 student_no | student_name | age
------------+--------------+-----
          3 | 王二         |  15
(1 row)

五、刪除觸發(fā)器

5.1 語法

DROP TRIGGER [ IF EXISTS ] name ON table_name [ CASCADE | RESTRICT ]

參數(shù)說明

  • IF EXISTS:如果該觸發(fā)器不存在則不要拋出一個(gè)錯(cuò)誤,而是發(fā)出一個(gè)提示。
  • name:要移除的觸發(fā)器的名稱。
  • table_name:定義了該觸發(fā)器的表的名稱(可以是模式限定的)。
  • CASCADE:自動(dòng)刪除依賴于該觸發(fā)器的對(duì)象,然后刪除所有 依賴于那些對(duì)象的對(duì)象(見第5.14節(jié))。
  • RESTRICT:如果有任何對(duì)象依賴于該觸發(fā)器,則拒絕刪除它。這是默認(rèn)值。

5.2 示例

DROP TRIGGER user_new_name_student_trigger ON student;

刪除觸發(fā)器時(shí),觸發(fā)器的函數(shù)不會(huì)被刪除。不過,當(dāng)刪除表時(shí),表上的觸發(fā)器也會(huì)被刪除。

六、觸發(fā)器行為

6.1 觸發(fā)器使用場景

何時(shí)事件行級(jí)語句級(jí)
BEFOREINSERT/UPDATE/DELETE表和外部表表、視圖和外部表
BEFORETRUNCATENULL
AFTERINSERT/UPDATE/DELETE表和外部表表、視圖和外部表
AFTERTRUNCATENULL
INSTEAD OFINSERT/UPDATE/DELETE視圖NULL
INSTEAD OFTRUNCATENULLNULL
  • INSTEAD OF 觸發(fā)器,僅用于行級(jí)觸發(fā)器對(duì)視圖插入、更新或刪除的情況。
  • BEFORE 和 AFTER 觸發(fā)器作用于視圖時(shí),僅用于語句級(jí)觸發(fā)器對(duì)視圖插入、更新或刪除的情況。
  • BEFORE 和 AFTER 觸發(fā)器,TRUNCATE 觸發(fā)時(shí),僅用于語句級(jí)觸發(fā)器對(duì)表清空操作的情況。

6.2 觸發(fā)器函數(shù)返回值

  • 語句級(jí)觸發(fā)器應(yīng)該總是返回 NULL,即必須顯式地在觸發(fā)器函數(shù)中寫上"ETURN NULL",如果沒有寫將導(dǎo)致報(bào)錯(cuò)。
  • BEFORE 和 INSTEAD OF 行級(jí)觸發(fā)器,返回 NULL,則表示忽略對(duì)當(dāng)前行的操作。返回非 NULL 的行,對(duì)于 INSERT 和 UPDATE 操作來說,返回的行將成為被插入的行或者是將要更新的行。
  • AFTER 行級(jí)觸發(fā)器,其返回值會(huì)被忽略。
  • 同一事件上有多個(gè)觸發(fā)器,則將按觸發(fā)器名稱的順序來觸發(fā)。BEFORE 和 INSTEAD OF 行級(jí)觸發(fā)器,每個(gè)觸發(fā)器返回的行(可能已經(jīng)被修改)將成為下一個(gè)觸發(fā)器的輸入。如果 BEFORE 和 INSTEAD OF 行級(jí)觸發(fā)器返回的內(nèi)容為空,那么該行上的其他行級(jí)觸發(fā)器也不會(huì)被觸發(fā)。

七、觸發(fā)器函數(shù)中的特殊變量

當(dāng)把一個(gè) PL/pgSQL 函數(shù)當(dāng)作觸發(fā)器函數(shù)調(diào)用時(shí),系統(tǒng)會(huì)在頂層聲明段中自動(dòng)創(chuàng)建幾個(gè)特殊變量,比如在前面示例中的 NEW、OLD、TG_OP 變量等??梢允褂玫淖兞咳缦拢?/p>

  • NEW:該變量為 INSERT/UPDATE 操作觸發(fā)的行級(jí)觸發(fā)器中存儲(chǔ)新的數(shù)據(jù)行,數(shù)據(jù)類型是"RECORD"。在語句級(jí)別的觸發(fā)器中此變量未分配,DELETE 操作觸發(fā)的行級(jí)觸發(fā)器中此變量也未分配。
  • OLD:該變量為 UPDATE/DELETE 操作觸發(fā)的行級(jí)觸發(fā)器中存儲(chǔ)原有的數(shù)據(jù)行,數(shù)據(jù)類型是"RECORD"。在語句級(jí)別的觸發(fā)器中此變量未分配,INSERT 操作觸發(fā)的行級(jí)觸發(fā)器中此變量也未分配。
  • TG_NAME:數(shù)據(jù)類型是 name 類型,該變量包含實(shí)際觸發(fā)的觸發(fā)器名。
  • TG_WHEN:內(nèi)容為"BEFORE"或"AFTER"字符串用于指定是 BEFORE 觸發(fā)器還是 AFTER 觸發(fā)器。
  • TG_LEVEL:內(nèi)容為"ROW"或"STATEMENT"字符串用于指定是語句級(jí)觸發(fā)器還是行級(jí)觸發(fā)器。TG_OP:內(nèi)容為"INSERT"“UPDATE”“DELETE”"TRUNCATE"之一的字符串,用于指定 DML 語句的類型。
  • TG_RELID:觸發(fā)器所在表的 OID。
  • TG_RELNAME:觸發(fā)器所在表的名稱,該變量即將廢棄,建議使用 TG_TABLE_NAME 變量來替換此變量。
  • TG_TABLE_NAME:觸發(fā)器所在表的名稱。
  • TG_TABLE_SCHEMA:觸發(fā)器所在表的模式。
  • TG_NARGS:CREATE TRIGGER 語句中賦予觸發(fā)器過程參數(shù)的個(gè)數(shù)。
  • TG_ARGV[]:為text類型的數(shù)組;是 CREATE TRIGGER 語句中的參數(shù)。

八、事件觸發(fā)器

8.1 事件觸發(fā)器概述

  PostgreSQL從9.3 版開始支持一種稱為"Event Trigger"的觸發(fā)器,這種觸發(fā)器主要用于彌補(bǔ)PostgreSQL 以前版本不支持 DDL 觸發(fā)器的不足。由于事件觸發(fā)器涉及的權(quán)限較大,比如能禁止 DDL 操作等,所以只有超級(jí)用戶才能創(chuàng)建和修改事件觸發(fā)器。目前,事件觸發(fā)器支持以下 3 種 DDL 事件。

  • ddl_command_start:DDL開始執(zhí)行前被觸發(fā)。
  • ddl_command_end:一個(gè)DDL執(zhí)行完成后被觸發(fā)。
  • sql_drop:刪除數(shù)據(jù)庫對(duì)象前被觸發(fā)。

8.2 創(chuàng)建事件觸發(fā)器

1)語法

CREATE EVENT TRIGGER name
    ON event
    [ WHEN filter_variable IN (filter_value [, ... ]) [ AND ... ] ]
    EXECUTE { FUNCTION | PROCEDURE } function_name()

參數(shù)說明

name:觸發(fā)器的名稱。在該數(shù)據(jù)庫中這個(gè)名稱必須唯一。
event:會(huì)觸發(fā)對(duì)給定函數(shù)調(diào)用的事件名稱。
filter_variable:用來過濾事件的變量名稱。這可以用來限制觸發(fā)器只為它支持的那一部分情況引發(fā)。當(dāng)前唯一支持的 filter_variable 是 TAG。
filter_value:與該觸發(fā)器要為其引發(fā)的 filter_variable 相關(guān)聯(lián)的一個(gè)值列表。對(duì)于 TAG,這表示一個(gè)命令標(biāo)簽列表(例如 ‘DROP FUNCTION’)。
function_name:一個(gè)用戶提供的函數(shù),它被聲明為沒有參數(shù)并且返回類型 event_trigger。在CREATE EVENT TRIGGER 的語法中,關(guān)鍵字 CREATE EVENT TRIGGER 和PROCEDURE 是等效的,但是被引用的函數(shù)在任何情況下都必須是函數(shù),而不是過程。此處關(guān)鍵字 PROCEDURE的 使用是歷史性的,已棄用。

2)示例

在創(chuàng)建事件觸發(fā)器之前,必須先創(chuàng)建觸發(fā)器函數(shù),事件觸發(fā)器函數(shù)的返回類型為 event_trigger,注意,其與普通觸發(fā)器函數(shù)的返回類型 trigger 是不一樣的。禁止執(zhí)行任何 DDL 示例如下:

CREATE OR REPLACE FUNCTION abort_any_command()
  RETURNS event_trigger
 LANGUAGE plpgsql
  AS $$
BEGIN
  RAISE EXCEPTION 'command % is disabled', tg_tag;
END;
$$;

CREATE EVENT TRIGGER abort_ddl ON ddl_command_start
   EXECUTE FUNCTION abort_any_command();

8.3 修改事件觸發(fā)器

1)語法

ALTER EVENT TRIGGER name DISABLE
ALTER EVENT TRIGGER name ENABLE [ REPLICA | ALWAYS ]
ALTER EVENT TRIGGER name OWNER TO { new_owner | CURRENT_USER | SESSION_USER }
ALTER EVENT TRIGGER name RENAME TO new_name

參數(shù)說明

name:要修改的現(xiàn)有觸發(fā)器的名稱。
new_owner:該事件觸發(fā)器的新?lián)碛姓叩挠脩裘?br />new_name:該事件觸發(fā)器的新名稱。
DISABLE/ENABLE [ REPLICA | ALWAYS ] TRIGGER:這些形式配置事件觸發(fā)器的觸發(fā)。一個(gè)被禁用的觸發(fā)器對(duì)系統(tǒng)來說仍然是可知的,但是當(dāng)期觸發(fā)事件發(fā)生時(shí)卻不會(huì)執(zhí)行它。

2)示例

--禁用事件觸發(fā)器
ALTER EVENT TRIGGER abort_ddl DISABLE;

8.4 刪除事件觸發(fā)器

1)語法

DROP EVENT TRIGGER [ IF EXISTS ] name [ CASCADE | RESTRICT ]

參數(shù)說明

IF EXISTS:如果該事件觸發(fā)器不存在則不要拋出一個(gè)錯(cuò)誤,而是發(fā)出一個(gè)提示。
name:要移除的事件觸發(fā)器的名稱。
CASCADE:自動(dòng)刪除依賴于該觸發(fā)器的對(duì)象,然后刪除所有依賴于那些對(duì)象的對(duì)象。
RESTRICT:如果有任何對(duì)象依賴于該觸發(fā)器,則拒絕刪除它。這是默認(rèn)值。

2)示例

--刪除事件觸發(fā)器
DROP EVENT TRIGGER abort_ddl;

總結(jié) 

到此這篇關(guān)于PostgreSql觸發(fā)器創(chuàng)建、使用以及刪除的文章就介紹到這了,更多相關(guān)PostgreSql觸發(fā)器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 教你在PostgreSql中使用JSON字段的方法

    教你在PostgreSql中使用JSON字段的方法

    這篇文章主要介紹了干貨教你在PostgreSql中使用JSON字段,通過本文可掌握在pg數(shù)據(jù)庫中如何正確使用json字段,如何進(jìn)行數(shù)據(jù)查詢,在where子查詢中如何使用,以及對(duì)json值進(jìn)行聚合查詢使用,需要的朋友可以參考下
    2022-11-11
  • postgresql 循環(huán)函數(shù)的簡單實(shí)現(xiàn)操作

    postgresql 循環(huán)函數(shù)的簡單實(shí)現(xiàn)操作

    這篇文章主要介紹了postgresql 循環(huán)函數(shù)的簡單實(shí)現(xiàn)操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • PostgreSQL更新表時(shí)時(shí)間戳不會(huì)自動(dòng)更新的解決方法

    PostgreSQL更新表時(shí)時(shí)間戳不會(huì)自動(dòng)更新的解決方法

    這篇文章主要為大家詳細(xì)介紹了PostgreSQL更新表時(shí)時(shí)間戳不會(huì)自動(dòng)更新的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • PostgreSQL數(shù)據(jù)庫備份與恢復(fù)的四種辦法

    PostgreSQL數(shù)據(jù)庫備份與恢復(fù)的四種辦法

    在數(shù)據(jù)為王的時(shí)代,數(shù)據(jù)庫中存儲(chǔ)的信息堪稱企業(yè)的生命線,而PostgreSQL作為一款廣泛應(yīng)用的開源數(shù)據(jù)庫,學(xué)會(huì)如何妥善進(jìn)行備份與恢復(fù)操作,是每個(gè)開發(fā)者與運(yùn)維人員必備的技能,今天,咱們就深入探究一下PostgreSQL相關(guān)的備份恢復(fù)策略,并附上豐富的代碼示例
    2025-01-01
  • 在PostgreSQL中設(shè)置表中某列值自增或循環(huán)方式

    在PostgreSQL中設(shè)置表中某列值自增或循環(huán)方式

    這篇文章主要介紹了在PostgreSQL中設(shè)置表中某列值自增或循環(huán)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • PostgreSQL管理工具phpPgAdmin入門指南

    PostgreSQL管理工具phpPgAdmin入門指南

    phpPgAdmin是用PHP開發(fā)的一個(gè)基于web的PostgreSQL數(shù)據(jù)庫管理工具。和MySql時(shí)代的PHPMyAdmin類似。本文介紹了phpPgAdmin安裝和使用方法,需要的朋友可以參考下
    2014-03-03
  • postgresql運(yùn)維之遠(yuǎn)程遷移操作

    postgresql運(yùn)維之遠(yuǎn)程遷移操作

    這篇文章主要介紹了postgresql運(yùn)維之遠(yuǎn)程遷移操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • shell腳本操作postgresql的方法

    shell腳本操作postgresql的方法

    PostgreSQL支持大部分的SQL標(biāo)準(zhǔn)并且提供了很多其他現(xiàn)代特性,如復(fù)雜查詢、外鍵、觸發(fā)器、視圖、事務(wù)完整性、多版本并發(fā)控制等這篇文章主要介紹了shell腳本操作postgresql,需要的朋友可以參考下
    2022-12-12
  • PostgreSQL的整型、浮點(diǎn)型、固定精度數(shù)值和序列等數(shù)字類型

    PostgreSQL的整型、浮點(diǎn)型、固定精度數(shù)值和序列等數(shù)字類型

    PostgreSQL(簡稱PGSQL)是一種開源關(guān)系型數(shù)據(jù)庫管理系統(tǒng),廣泛應(yīng)用于企業(yè)級(jí)應(yīng)用,文章詳細(xì)介紹了PostgreSQL的數(shù)字類型,包括整型、浮點(diǎn)型、固定精度數(shù)值型和序列類型,強(qiáng)調(diào)了選擇合適的數(shù)字類型對(duì)于數(shù)據(jù)庫的存儲(chǔ)效率、查詢性能和數(shù)據(jù)準(zhǔn)確性的重要性
    2024-09-09
  • PostgreSQL事務(wù)回卷實(shí)戰(zhàn)案例詳析

    PostgreSQL事務(wù)回卷實(shí)戰(zhàn)案例詳析

    前段時(shí)間在公司小范圍做了一個(gè)關(guān)于PG事務(wù)實(shí)現(xiàn)的講座,最后總結(jié)了一個(gè)摘要性的東西,分享一下,這篇文章主要給大家介紹了關(guān)于PostgreSQL事務(wù)回卷實(shí)戰(zhàn)案例的相關(guān)資料,需要的朋友可以參考下
    2022-03-03

最新評(píng)論