这里有一个小问题:在插入之前执行的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";
不幸的是,它不工作!有什么想法吗?