SQL Server 触发器 当一个字段值修改时,修改当前数据其他字段值

本文介绍了两个SQL触发器的创建,分别针对不同表格,在特定字段更新时执行特定操作。第一个触发器在'tb'表的'column1'字段被更新时,将'test'字段设置为'g2'。第二个触发器在'ICStockBill'表的'FStatus'字段更新后,根据更新的'FInterID'更新'ICStockBillEntry'表的相关字段。
create  TRIGGER testtrigger --触发器名称
   on tb  --表名
  after update --更新触发
  as
  if update (column1)  --当column1字段被更新时,才会触发此触发器
BEGIN
    SET NOCOUNT ON;
    DECLARE @a VARCHAR (20)  --定义变量
    SET @a = (SELECT d.ida
    FROM
        deleted d,
        inserted i
    WHERE
        d.ida = i.ida
) --变量赋值 ,找到对应更新的那一行。
    update  tb  set  test = 'g2' where ida = @a --执行的操作
end
create  TRIGGER  [dbo].[billtrigger]  
   on [dbo].[ICStockBill] 
  after update --更新触发
  as
  if update (FStatus)  --当FStatus字段被更新时,才会触发此触发器
BEGIN
    SET NOCOUNT ON;
    DECLARE @a VARCHAR (20)  --定义变量
    SET @a = (SELECT
	d.FInterID
    FROM
        deleted d,
        inserted i
    WHERE
        d.FInterID = i.FInterID
) --变量赋值 ,找到对应更新的那一行。
update  ICStockBillEntry set  FEntrySelfB0457 = 
(select  b.FQty from ICInventory b 
where   ICStockBillEntry.FItemID = b.FItemID 
and  ICStockBillEntry.FSCStockID=b.FStockID)
where  finterid =@a
end

SQL Server 中,可以通过创建 `AFTER UPDATE` 触发器来实现当某一字段更改自动更新另一个字段的需求。触发器可以检查 `INSERTED` 和 `DELETED` 伪表以判断特定字段是否发生了更改,并据此执行相应的逻辑操作。 以下是一个示例,展示如何创建一个触发器,在某个字段(例如 `status`)被修改,自动更新另一个字段(例如 `modified_date`)的: ```sql CREATE TRIGGER trg_UpdateModifiedDate ON your_table_name AFTER UPDATE AS BEGIN -- 检查 status 字段是否被更新 IF (COLUMNS_UPDATED() & 1) > 0 BEGIN -- 更新 modified_date 字段当前间 UPDATE yt SET yt.modified_date = GETDATE() FROM your_table_name yt INNER JOIN INSERTED i ON yt.id = i.id WHERE yt.status <> (SELECT status FROM DELETED d WHERE d.id = yt.id) END END ``` ### 说明: - `your_table_name`:替换为你实际使用的表名。 - `id`:主键字段,用于关联 `INSERTED` 表和原表。 - `status`:需要监控的字段。 - `modified_date`:需要根据 `status` 变化而更新的字段。 - `GETDATE()`:获取当前间并赋给 `modified_date`。 - `COLUMNS_UPDATED()`:函数用于检测哪些列被更新。`IF (COLUMNS_UPDATED() & 1) > 0` 是用来检测第一列(即 `status` 列)是否被更新。如果 `status` 不是表中的第一个字段,请根据实际情况调整位掩码 [^2]。 ### 扩展功能: 如果希望触发器仅在某些条件下才更新字段,可以在 `WHERE` 子句中添加额外的过滤条件。例如,只有当 `status` 从 `'Pending'` 变为 `'Completed'` 才更新 `modified_date`: ```sql UPDATE yt SET yt.modified_date = GETDATE() FROM your_table_name yt INNER JOIN INSERTED i ON yt.id = i.id INNER JOIN DELETED d ON yt.id = d.id WHERE i.status = 'Completed' AND d.status = 'Pending' ``` ### 注意事项: - 确保触发器逻辑不会导致无限循环或不必要的性能开销。 - 如果表中没有 `modified_date` 字段,请先通过 `ALTER TABLE` 添加该字段 [^4]。 ---
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值