代码之家  ›  专栏  ›  技术社区  ›  Aness

如何从BEFORE-INSERT触发器中取消PostgreSQL数据库中的INSERT操作(已在MySQL中完成)

  •  1
  • Aness  · 技术社区  · 6 年前

    这里有一个小问题:在插入之前执行的Postgresql触发器中,如何从触发器函数中取消插入操作?

    示例:我有一个包含两个字段(id,field_a)的表,我有一个触发器,它在插入该表中的行之前在中执行。

    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";
    

    不幸的是,它不工作!有什么想法吗?

    1 回复  |  直到 5 年前
        1
  •  1
  •   Aness    6 年前

    正如报告中所指出的那样 link 通过@user2864740,这个想法很好,就像MySQL引发一个异常一样,但我在拼写代码时出错了

    引发异常“请选择其他号码!!”;

    在触发体功能中