简单修改触发器

创建时语句:
CREATE SEQUENCE SEQ_SITEPRO_ATTR INCREMENT BY 1 START WITH 7922 NOCYCLE CACHE 10 ORDER;
有触发器,后来需求原因,删掉触发器。

修改触发器:
CREATE OR REPLACE TRIGGER TRI_FOR_SITEPRO_ATTR
BEFORE INSERT ON SITEPRO_ATTR
FOR EACH ROW
DECLARE
BEGIN
SELECT SEQ_SITEPRO_ATTR.NEXTVAL INTO:NEW.ID FROM DUAL;
END TRI_FOR_SITEPRO_ATTR;
### 如何修改数据库触发器 在关系型数据库管理系统中,触发器是一种特殊的存储过程,在特定事件发生时自动执行。然而,大多数主流数据库并不支持直接通过 `ALTER` 命令来修改已有的触发器定义。通常情况下,如果需要更改触发器的行为,则需先删除旧的触发器并重新创建一个新的。 以下是针对几种常见数据库系统的具体实现方法: #### MySQL MySQL 不允许直接修改现有的触发器。要更新触发器的功能,必须遵循以下流程: 1. 使用 `DROP TRIGGER` 删除现有触发器。 2. 创建新的触发器以替代被移除的那个。 示例如下: ```sql -- 删除原有的触发器 DROP TRIGGER IF EXISTS old_trigger_name; -- 新建替换后的触发器 CREATE TRIGGER new_trigger_name AFTER INSERT ON table_name FOR EACH ROW BEGIN -- 更新逻辑写在此处 END; ``` 此操作方式基于引用描述[^1]中的基础语法规则扩展而来。 #### PostgreSQL 对于PostgreSQL而言,同样不存在用于修改已有触发器功能的单一命令。但是可以通过查询系统元数据表获取当前触发器的相关信息以便重建它。利用下面这条SQL可以从information_schema视图里检索到指定表格上的所有触发器详情: ```sql SELECT * FROM information_schema.triggers WHERE event_object_table='your_table'; ``` 这段脚本来源于提供的资料[^2] 。据此我们可以得知某个具体的trigger设置情况从而决定怎样重构它们。 另外值得注意的是,在某些特殊场景下可能仅需调整触发条件或者关联动作而无需完全重做整个结构;此时只需小心编辑涉及部分即可满足需求变化。 #### Oracle Database & SQL Server 这两种平台也采取相似策略——即销毁再新建机制处理此类变更请求。不过各自存在细微差别比如命名空间管理等方面需要注意兼容性问题等等。 --- ### 示例代码展示 这里给出一个简单的例子说明如何在实际应用环境中完成这一系列步骤: 假设我们有一个名为student_info的学生基本信息表以及对应的变动日志记录variation表(参照给定的例子构建)。现在希望当任何一条学籍数据发生变化时候能够及时登记相应改动历史至后者当中去。 原初版本可能是这样的: ```sql DELIMITER $$ CREATE TRIGGER update_variation_log AFTER UPDATE ON student_info FOR EACH ROW BEGIN INSERT INTO variation (s_id , s_name,var_text,cur_date ) VALUES(OLD.s_id,'',CONCAT('Updated record with id ', OLD.s_id),NOW()); END$$ DELIMITER ; ``` 后来发现还需要额外加入姓名字段同步显示出来于是做出改进得到最终形态如下所示: ```sql -- 首先前置工作就是把之前的那个干掉 DROP TRIGGER IF EXISTS update_variation_log ; -- 接着按照最新标准重塑之 DELIMITER $$ CREATE TRIGGER update_variation_log_v2 AFTER UPDATE ON student_info FOR EACH ROW BEGIN IF NEW.s_name != OLD.s_name THEN SET @change_desc := CONCAT('Name changed from "', OLD.s_name,'" to "',NEW.s_name,'"'); ELSEIF ... END IF; -- 可继续补充其他判断分支 -- 执行插入新纪录的动作 INSERT INTO variation (s_id,s_name,var_text,cur_date) VALUE(NEW.s_id,NEW.s_name,@change_desc,NOW()); END$$ DELIMITER ; ``` 以上便是完整的解决方案概述及其配套实例演示。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值