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

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

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

一、概述

觸發(fā)器(Trigger)是由事件自動觸發(fā)執(zhí)行的一種特殊的存儲過程,觸發(fā)事件可以是對一個表進行INSERT、UPDATE、DELETE等操作。觸發(fā)器經(jīng)常用于加強數(shù)據(jù)的完整性約束和業(yè)務規(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ā)器的名稱。這必須與同一個表上的任何其他觸發(fā)器相區(qū)別。名稱不能是模式限定的,該觸發(fā)器會繼承它所在表的模式。
BEFORE|AFTER|INSTEAD OF:決定該函數(shù)是要在事件之前、之后被調(diào)用還是會取代該事件。
event:INSERT、UPDATE、DELETE 或者 TRUNCATE 之一,這指定了將要引發(fā)該觸發(fā)器的事件。多個事件可以用 OR 指定,要求傳遞關系的時候除外。

對于 UPDATE 事件,可以使用下面的語法指定一個列的列表:

 UPDATE OF column_name1 [, column_name2 ... ]

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

2.2 示例

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

--創(chuàng)建學生表
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ù)測試驗證觸發(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)

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

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

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

對 student 表的更新情況進行記錄。

--創(chuàng)建日志記錄表
CREATE TABLE log_student(
update_time timestamp, --操作的時間
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)建語句級觸發(fā)器
CREATE TRIGGER log_student_trigger
AFTER INSERT OR DELETE OR UPDATE ON student
FOR STATEMENT EXECUTE PROCEDURE log_student_trigger ();

--插入數(shù)據(jù),驗證觸發(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 中均記錄對應操作的一條數(shù)據(jù),執(zhí)行了更新語句,但沒有更新數(shù)據(jù),也會觸發(fā)一條記錄日志操作。說明語句觸發(fā)器是按語句進行觸發(fā)的,而不管這條語句實際操作了多少行數(shù)據(jù)。

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

對 student 表的更新情況進行記錄。

--創(chuàng)建日志記錄表
CREATE TABLE log_student(
update_time timestamp, --操作的時間
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)建行級觸發(fā)器
CREATE TRIGGER log_student_trigger2
AFTER INSERT OR DELETE OR UPDATE ON student
FOR ROW EXECUTE PROCEDURE log_student_trigger ();

--插入數(shù)據(jù),驗證觸發(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 中均記錄對應條數(shù)的數(shù)據(jù),更新操作沒有更新實際行時,不觸發(fā)記錄日志。說明行級觸發(fā)器是按影響行數(shù)進行觸發(fā)的。

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

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

4.1 BEFORE 觸發(fā)器示例

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

--創(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ù)驗證觸發(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ā)器不存在則不要拋出一個錯誤,而是發(fā)出一個提示。
  • name:要移除的觸發(fā)器的名稱。
  • table_name:定義了該觸發(fā)器的表的名稱(可以是模式限定的)。
  • CASCADE:自動刪除依賴于該觸發(fā)器的對象,然后刪除所有 依賴于那些對象的對象(見第5.14節(jié))。
  • RESTRICT:如果有任何對象依賴于該觸發(fā)器,則拒絕刪除它。這是默認值。

5.2 示例

DROP TRIGGER user_new_name_student_trigger ON student;

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

六、觸發(fā)器行為

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

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

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

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

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

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

  • NEW:該變量為 INSERT/UPDATE 操作觸發(fā)的行級觸發(fā)器中存儲新的數(shù)據(jù)行,數(shù)據(jù)類型是"RECORD"。在語句級別的觸發(fā)器中此變量未分配,DELETE 操作觸發(fā)的行級觸發(fā)器中此變量也未分配。
  • OLD:該變量為 UPDATE/DELETE 操作觸發(fā)的行級觸發(fā)器中存儲原有的數(shù)據(jù)行,數(shù)據(jù)類型是"RECORD"。在語句級別的觸發(fā)器中此變量未分配,INSERT 操作觸發(fā)的行級觸發(fā)器中此變量也未分配。
  • TG_NAME:數(shù)據(jù)類型是 name 類型,該變量包含實際觸發(fā)的觸發(fā)器名。
  • TG_WHEN:內(nèi)容為"BEFORE"或"AFTER"字符串用于指定是 BEFORE 觸發(fā)器還是 AFTER 觸發(fā)器。
  • TG_LEVEL:內(nèi)容為"ROW"或"STATEMENT"字符串用于指定是語句級觸發(fā)器還是行級觸發(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ù)的個數(shù)。
  • TG_ARGV[]:為text類型的數(shù)組;是 CREATE TRIGGER 語句中的參數(shù)。

八、事件觸發(fā)器

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

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

  • ddl_command_start:DDL開始執(zhí)行前被觸發(fā)。
  • ddl_command_end:一個DDL執(zhí)行完成后被觸發(fā)。
  • sql_drop:刪除數(shù)據(jù)庫對象前被觸發(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ù)庫中這個名稱必須唯一。
event:會觸發(fā)對給定函數(shù)調(diào)用的事件名稱。
filter_variable:用來過濾事件的變量名稱。這可以用來限制觸發(fā)器只為它支持的那一部分情況引發(fā)。當前唯一支持的 filter_variable 是 TAG。
filter_value:與該觸發(fā)器要為其引發(fā)的 filter_variable 相關聯(lián)的一個值列表。對于 TAG,這表示一個命令標簽列表(例如 ‘DROP FUNCTION’)。
function_name:一個用戶提供的函數(shù),它被聲明為沒有參數(shù)并且返回類型 event_trigger。在CREATE EVENT TRIGGER 的語法中,關鍵字 CREATE EVENT TRIGGER 和PROCEDURE 是等效的,但是被引用的函數(shù)在任何情況下都必須是函數(shù),而不是過程。此處關鍵字 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ā)。一個被禁用的觸發(fā)器對系統(tǒng)來說仍然是可知的,但是當期觸發(fā)事件發(fā)生時卻不會執(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ā)器不存在則不要拋出一個錯誤,而是發(fā)出一個提示。
name:要移除的事件觸發(fā)器的名稱。
CASCADE:自動刪除依賴于該觸發(fā)器的對象,然后刪除所有依賴于那些對象的對象。
RESTRICT:如果有任何對象依賴于該觸發(fā)器,則拒絕刪除它。這是默認值。

2)示例

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

總結 

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

相關文章

  • PostgreSQL中的psql命令詳解

    PostgreSQL中的psql命令詳解

    psql是PostgreSQL的一個命令行交互式客戶端工具,它具有非常豐富的功能,類似于Oracle的命令行工具sqlplus,這篇文章主要介紹了PostgreSQL-psql命令詳解,需要的朋友可以參考下
    2023-07-07
  • 將PostgreSQL的數(shù)據(jù)實時同步到Doris的技巧分享

    將PostgreSQL的數(shù)據(jù)實時同步到Doris的技巧分享

    眾所周知,在兩個毫不相干的數(shù)據(jù)管理系統(tǒng)之間進行數(shù)據(jù)同步,特別是實時同步,其復雜程度足以讓高級DBA腦瓜疼,本文給大家介紹了將PostgreSQL的數(shù)據(jù)實時同步到Doris的技巧分享,需要的朋友可以參考下
    2024-03-03
  • PostgreSQL教程(十):性能提升技巧

    PostgreSQL教程(十):性能提升技巧

    這篇文章主要介紹了PostgreSQL教程(十):性能提升技巧,本文講解了使用EXPLAIN、批量數(shù)據(jù)插入、關閉自動提交、使用COPY、 刪除索引、刪除外鍵約束等技巧,需要的朋友可以參考下
    2015-05-05
  • 查詢PostgreSQL中所有表邏輯外鍵的方法

    查詢PostgreSQL中所有表邏輯外鍵的方法

    本文介紹了如何查詢PostgreSQL中所有表的邏輯外鍵,并指導您如何先刪除再重新建立這些外鍵,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友一起看看吧
    2023-08-08
  • postgresql 性能參數(shù)配置方式

    postgresql 性能參數(shù)配置方式

    這篇文章主要介紹了postgresql 性能參數(shù)配置方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • PostgreSQL表膨脹問題解析及解決方案

    PostgreSQL表膨脹問題解析及解決方案

    表膨脹是指表的數(shù)據(jù)和索引所占文件系統(tǒng)的空間在有效數(shù)據(jù)量并未發(fā)生大的變化的情況下不斷增大,這種現(xiàn)象會導致關系文件被大量空洞填滿,從而浪費大量的磁盤空間,本文給大家介紹了PostgreSQL表膨脹問題解析及解決方案,需要的朋友可以參考下
    2024-11-11
  • 修改postgresql存儲目錄的操作方式

    修改postgresql存儲目錄的操作方式

    這篇文章主要介紹了修改postgresql存儲目錄的操作方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • PostgreSQL中的OID和XID 說明

    PostgreSQL中的OID和XID 說明

    在PostgreSQL中經(jīng)常碰到OID和XID,剛才不明白這些東西是干什么的。
    2009-09-09
  • PostgreSQL COALESCE使用方法代碼解析

    PostgreSQL COALESCE使用方法代碼解析

    這篇文章主要介紹了PostgreSQL COALESCE使用方法代碼解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-12-12
  • Postgresql中LIKE和ILIKE操作符的用法詳解

    Postgresql中LIKE和ILIKE操作符的用法詳解

    這篇文章主要介紹了Postgresql中LIKE和ILIKE操作符的用法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01

最新評論