SqlServer Update触发器判断某个字段的值是否已经更改

要求:修改主表中某个字段的值,自动更新子表中的某个字段

我们为了不更改程序,创建一个update触发器。

create trigger [tig_update] on 表名
after update  
as 
declare @id int
begin
	if (update(主表列名))
		begin
			select @id=id from inserted
			update 子表名 set lasttime = GETDATE() where pid = @id
		end
end
效果好像不对, 单用if  update(a),  也体现不出效果,  为什么?  

如果我们执行

update 主表 set 列名a=原来的值 where id = id

发现也触发这个事件,这是不对的,只有列名a的值发生了改变,我们才能修改子表的数据啊:

我们改为以下的触发器,效果就出来了

create trigger [tig_update] on 表名
after update  
as 
declare @id int,
@upflag int
begin
select @upflag = case when a.列名=b.列名 then 0 else 1 end, @id=a.id from deleted a left join inserted b on a.id = b.id
if (@upflag>0)
update 子表名 set lasttime = GETDATE() where pid = @id
end


解释一下,deleted表中存的是修改前的值,inserted中存的是修改后的值,这样是不是更好呢!

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: SQL Server 触发器UPDATE 写法如下: ``` CREATE TRIGGER trigger_name ON table_name AFTER UPDATE AS BEGIN -- update logic here UPDATE table_name SET column1 = value1, column2 = value2 WHERE some_column = some_value END ``` - `CREATE TRIGGER` 是用来创建触发器的语句。 - `trigger_name` 是触发器的名称。 - `ON table_name` 是触发器所作用的表。 - `AFTER UPDATE` 表示触发器是在更新操作之后被触发。 - `BEGIN` 和 `END` 是触发器的主体,在这里面定义了触发器所要执行的逻辑。 - `UPDATE table_name` 是在触发器中执行的更新操作。 - `SET column1 = value1, column2 = value2` 是更新字段。 - `WHERE some_column = some_value` 是更新的条件。 ### 回答2: 在SQL Server中,触发器是一种特殊的存储过程,它会在特定的条件下被自动调用。通常情况下,触发器用于监测数据库中的变化,并根据这些变化执行一些特定的操作。在使用触发器时,我们需要特别注意触发器的编写规范和更新写法。 SQL Server中的触发器分为三种类型:INSERT触发器UPDATE触发器和DELETE触发器。其中,UPDATE触发器主要用于监测数据库中的更新操作。 在编写UPDATE触发器时,我们需要注意以下几个方面: 1. 触发器的创建语法:CREATE TRIGGER trigger_name {ON table_name | ON DATABASE} {FOR | AFTER | INSTEAD OF} {INSERT, UPDATE, DELETE} 2. 触发器的运行顺序:UPDATE触发器会在BEFORE UPDATE和AFTER UPDATE之间运行,我们可以使用NEW和OLD来分别表示更新前和更新后的记录。 3. 触发器的写法:UPDATE触发器需要定义触发条件、更新语句以及日志记录等。在写UPDATE触发器时,我们可以使用INSERTED和DELETED特殊表来访问当前更新的记录以及更新前的记录。 例如,我们可以使用以下语句编写UPDATE触发器: CREATE TRIGGER update_trigger ON employees AFTER UPDATE AS BEGIN DECLARE @empid INT, @old_sal FLOAT, @new_sal FLOAT SELECT @empid = EmployeeID, @old_sal = Salary FROM DELETED SELECT @new_sal = Salary FROM INSERTED IF @new_sal <> @old_sal BEGIN INSERT INTO salary_changes(EmployeeID, OldSalary, NewSalary, ChangeDate) VALUES(@empid, @old_sal, @new_sal, GETDATE()) END END 在上面的例子中,我们定义了一个UPDATE触发器,当employees表中的Salary列更新时,触发器会向salary_changes表中插入相应的数据。通过使用DELETED和INSERTED特殊表,我们可以方便地获取更新前和更新后的Salary,并进行相应的计算和判断。 总之,在编写SQL Server触发器时,我们需要按照规范编写触发器的创建语法,并且需要注意更新语句和数据访问的方式,以保证触发器的正确性和高效性。 ### 回答3: 在SQL Server中,触发器是一种存储过程,当数据表的内容被修改时,触发器会自动执行,帮助我们自动处理数据的变化。其中,update触发器是当表中的某条数据被更新时触发。 SQL Serverupdate触发器的写法如下: CREATE TRIGGER trigger_name ON table_name AFTER UPDATE AS BEGIN -- 触发器中的语句 END 其中,trigger_name为触发器名,table_name为要触发的表名,AFTER UPDATE表示在表中的某条记录被更新后触发此触发器。 在触发器中可以根据需要执行不同的语句,常见的有以下几种: 1. 获取被更新的数据 在触发器中可以使用“inserted”和“deleted”两个特殊的表,分别对应着更新前和更新后的数据。例如: SELECT * FROM inserted 可以获取更新后的数据。 2. 更新相关的表 在触发器中也可以执行更新操作,从而更新相关的表。例如: UPDATE other_table SET column_name = new_value WHERE condition; 3. 发送电子邮件或通知 在触发器中可以使用sp_send_dbmail存储过程发送邮件或使用RAISERROR函数抛出异常通知相关人员。 4. 记录数据变化 在触发器中可以使用INSERT、UPDATE或DELETE语句将数据变化记录到日志表中。 总之,SQL Server中的update触发器可以轻松实现数据的实时更新和部分业务功能自动化,提高了数据处理的效率。但是,在使用触发器时需要慎重考虑,避免触发器的逻辑错误导致数据不一致或系统故障。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值