簡體   English   中英

如何從 BEFORE-INSERT TRIGGER 中取消 PostgreSQL 數據庫中的 INSERT 操作(已在 MySQL 中完成)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM