达梦数据库触发器示例

达梦数据库触发器示例

create  or replace trigger "DEMOS"."user insert to user_real"
after INSERT 
on "DEMOS"."USER"
referencing OLD ROW AS "OLD" NEW ROW AS "NEW"
for each row
BEGIN
	/*触发器体*/
insert into
	"DEMOS"."USER_REAL"
	(
	        "ID"         ,
	        "NAME"       ,
	        "AGE"        ,
	        "CREATE_TIME",
	        "UPDATE_TIME",
	        "ROLE_ID"
	)
	VALUES
	(
	        NEW."ID",
	        NEW."NAME",
	        NEW."AGE"          ,
	        NEW."CREATE_TIME"  ,
	        NEW."UPDATE_TIME"  ,
	        NEW."ROLE_ID"
	);
END;

在达梦数据库中,有三种不同的触发器类型:表级触发器(Table Trigger)、库级触发器(Database Trigger)和模式级触发器(Schema Trigger)。它们之间的区别如下:

  1. 表级触发器(Table Trigger):
    • 作用范围:仅在指定的表上触发。
    • 创建和管理:表级触发器是针对具体表创建和管理的,可以通过在表上使用CREATE TRIGGER语句来定义。
    • 触发事件:可以在插入、更新或删除表中的数据时触发,可以在AFTERBEFORE事件发生时执行相应的操作。
    • 访问数据:可以使用NEWOLD伪记录引用新旧数据。
  2. 库级触发器(Database Trigger):
    • 作用范围:在整个数据库中的表上触发。
    • 创建和管理:库级触发器是与数据库关联的,创建和管理库级触发器需要使用特定的语法,如CREATE DATABASE TRIGGER
    • 触发事件:可以在库中的任何表上的插入、更新或删除操作时触发,可以在AFTERBEFORE事件发生时执行相应的操作。
    • 访问数据:可以使用NEWOLD伪记录引用新旧数据。
  3. 模式级触发器(Schema Trigger):
    • 作用范围:在指定模式下的所有表上触发。
    • 创建和管理:模式级触发器是与特定模式关联的,创建和管理模式级触发器需要使用特定的语法,如CREATE SCHEMA TRIGGER
    • 触发事件:可以在模式中的任何表上的插入、更新或删除操作时触发,可以在AFTERBEFORE事件发生时执行相应的操作。
    • 访问数据:可以使用NEWOLD伪记录引用新旧数据。

总结:

  • 表级触发器是针对特定表的触发器,仅在该表上触发;
  • 库级触发器是针对整个数据库的触发器,作用于数据库中的所有表;
  • 模式级触发器是针对指定模式下的所有表的触发器,作用范围在特定模式内的所有表。

根据需求和业务逻辑,您可以选择适当的触发器类型来满足您的需求。

  • 这是改进后的

    再插入时判断有没有name值相同的记录,如果有则更新,没有则插入,并且加了异常捕捉,不会影响到原表的插入。

create  or replace trigger "DEMOS"."user insert to user_real2"
AFTER INSERT ON "DEMOS"."USER"
FOR EACH ROW
BEGIN
	/*触发器体*/
	MERGE INTO "DEMOS"."USER_REAL" t
	USING (
	    SELECT 	
			:NEW."ID" as "ID",
	        :NEW."NAME" as "NAME",
	        :NEW."AGE" AS "AGE"          ,
	        :NEW."CREATE_TIME" AS "CREATE_TIME" ,
	        :NEW."UPDATE_TIME" AS "UPDATE_TIME" ,
	        :NEW."ROLE_ID" AS "ROLE_ID"
	) s
	ON (t.name = s.name)
	WHEN MATCHED THEN
	    UPDATE SET t.id = s.id, t.age = s.age,t.CREATE_TIME = s.CREATE_TIME,t.update_time = s.update_time,t.role_id = s.role_id
	WHEN NOT MATCHED THEN
		insert 
		(
		        "ID"         ,
		        "NAME"       ,
		        "AGE"        ,
		        "CREATE_TIME",
		        "UPDATE_TIME",
		        "ROLE_ID"
		)
		VALUES
		(
		        :NEW."ID",
		        :NEW."NAME",
		        :NEW."AGE"          ,
		        :NEW."CREATE_TIME"  ,
		        :NEW."UPDATE_TIME"  ,
		        :NEW."ROLE_ID"
		);
		EXCEPTION
        -- 捕获异常,可以进行日志记录或其他操作
        WHEN OTHERS THEN
            -- 处理异常,可以根据需要进行逻辑处理
        NULL;
END;
posted @ 2023-10-07 20:32  刘冬冬的博客  阅读(460)  评论(0编辑  收藏  举报