[英]Where clause not working in a (before-insert) trigger which sets value to to a column from a different table
[英]How to cancel an INSERT operation in a PostgreSQL Database from within a BEFORE-INSERT TRIGGER (Have done this in MySQL)
我在 MySQL 做了一些工作,在那里我使用 TRIGGERS 在后端放置了很多業務邏輯,我必須遷移到 PostgreSQL,不幸的是觸發機制不一樣。 到目前為止,我認為我必須手動重新編碼它們。
這是一個小問題:在插入之前執行的 Postgresql 觸發器中 如何從觸發器 function 中取消插入操作?
示例:我有一個包含 2 個字段(id、field_a)的表,我有一個觸發器,它在在該表中插入一行之前執行。
只是為了說明這一點,如果 field_a = 5,我會從觸發器中取消此插入。
所以在 MySQL 我這樣做了(引發了一個自定義異常)並且它起作用了(停止插入並顯示一條自定義消息):
CREATE TABLE `mydatabase`.`mytable` (
`id` int(11) DEFAULT '0',
`field_a` int(11) DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC ;
CREATE DEFINER=`username`@`localhost` TRIGGER `the_trigger_in_mysql` BEFORE INSERT ON `mytable` FOR EACH ROW
BEGIN
IF NEW.a_field = 5 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Please choose another number!!';
END IF;
END;
我在這里嘗試為 Postgresql 做同樣的事情,發現了一些關於 Pgplsql 和所有內容的新內容
CREATE TABLE "public"."mytable" (
"id" int4 DEFAULT '0',
"field_a" int4 DEFAULT '0',
CONSTRAINT "mytable__pkey" PRIMARY KEY ("id")
) ;
ALTER TABLE "public"."log"
OWNER TO "username";
CREATE TRIGGER "the_trigger_in_postgresql" BEFORE INSERT ON "public"."mytable"
FOR EACH ROW
EXECUTE PROCEDURE "public"."the_trigger_in_postgresql_function"();
CREATE OR REPLACE FUNCTION "public"."the_trigger_in_postgresql_function"()
RETURNS "pg_catalog"."trigger" AS $BODY$BEGIN
IF NEW.a_field = 5 THEN
RAISE DEBUG 'Please choose another number!!';
END IF;
RETURN NEW;
END$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
ALTER FUNCTION "public"."the_trigger_in_postgresql_function"() OWNER TO "username";
不幸的是它不起作用? 對此有什么想法嗎?
所以正如@user2864740在鏈接中指出的那樣,這個想法很好,就像 MySQL 引發異常但我拼寫錯誤,代碼必須是
RAISE EXCEPTION '請選擇另一個號碼;!';
而不是在 TRIGGER 主體 function 中引發調試
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.