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ā)器使用場景
何時 | 事件 | 行級 | 語句級 |
---|---|---|---|
BEFORE | INSERT/UPDATE/DELETE | 表和外部表 | 表、視圖和外部表 |
BEFORE | TRUNCATE | NULL | 表 |
AFTER | INSERT/UPDATE/DELETE | 表和外部表 | 表、視圖和外部表 |
AFTER | TRUNCATE | NULL | 表 |
INSTEAD OF | INSERT/UPDATE/DELETE | 視圖 | NULL |
INSTEAD OF | TRUNCATE | NULL | NULL |
- 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的數(shù)據(jù)實時同步到Doris的技巧分享
眾所周知,在兩個毫不相干的數(shù)據(jù)管理系統(tǒng)之間進行數(shù)據(jù)同步,特別是實時同步,其復雜程度足以讓高級DBA腦瓜疼,本文給大家介紹了將PostgreSQL的數(shù)據(jù)實時同步到Doris的技巧分享,需要的朋友可以參考下2024-03-03