在使用SQL Server时,有时候希望针对数据表中某一字段的修改执行一段触发器代码,比如修改了人员名称时,我们希望数据库会自动执行一代码来修改同一数据表中的姓名拼音首字母字段。如果使用After Update触发器则会让SQL Server崩溃掉,那么有什么办法可以避免这种死循环吗?答案是肯定的,我可以在触发器中判断用户是否修改了姓名字段,如果是则执行后续更新代码,如果用户修改了其他字段,则不执行任何代码。
假设有一张表存储客户的信息,第一个字段是Visitor_ID,第二个字段Visitor_Name,第三个字段是Visitor_PY_Code。我们针对新增和更新动作写两个触发器。
针对新增的触发器很容易写,现在的问题是在更新的触发器,如果再使用Update语句就会循环执行触发器了,系统会崩溃掉的。我们希望只针对单一字段的更新执行触发器。还好SQL提供了COLUMNS_UPDATED()函数,能够判断出哪一字段被更新。于是将更新的触发器写成如下:
CREATETRIGGER[UpdatePYCodeOnly]ON[dbo].[Visitor]
FORUPDATE
AS
IF(COLUMNS_UPDATED()&2)=2BEGIN
declare
@VisitorIDint,
@NameStrnvarchar(50)
Select@VisitorID=Visitor_ID,@NameStr=Visitor_NameFromInserted
UpdateVisitorSetNamePINYIN=dbo.GetPYCode(@NameStr)WhereVisitor_ID=@VisitorID
END
FORUPDATE
AS
IF(COLUMNS_UPDATED()&2)=2BEGIN
declare
@VisitorIDint,
@NameStrnvarchar(50)
Select@VisitorID=Visitor_ID,@NameStr=Visitor_NameFromInserted
UpdateVisitorSetNamePINYIN=dbo.GetPYCode(@NameStr)WhereVisitor_ID=@VisitorID
END
在使用COLUMNS_UPDATED()函数需要注意以下几点:
- 表中第一个字段序号为0,第二个字段序号为1,依此类推
- 表中的字段顺序不要改动
版权声明:本文为博主原创文章,未经博主允许不得转载。
相关推荐
嵌套触发器的使用可以增加应用的灵活性,但同时也可能导致数据操作过程的复杂化,因此在设计嵌套触发器时需要谨慎,以避免出现死循环或性能下降等问题。 触发器作为一种数据库设计中的高级特性,具有极高的实用价值...
4. 触发器允许嵌套,最多可以达到32层嵌套,但超过最大嵌套级别或死循环时,系统会取消触发器。 5. 触发器的执行过程中,系统会生成两个特殊的逻辑表:deleted表和inserted表。这两个表不是存储在数据库中的实际表,...
在设计触发器时,应当考虑避免级联触发可能引起的死循环或性能问题。 3. 维护性问题:由于触发器是自动执行的,过多的触发器可能会使数据库系统的维护变得复杂。因此,在实际应用中应当根据需要合理设计触发器的...
特别是对于复杂的触发器逻辑,要仔细检查是否有可能产生死循环或者不合理的数据状态。另外,触发器的管理和维护也需要注意,随着业务逻辑的变化,触发器可能需要被修改或者废止,因此要有相应的维护策略来应对这些...
开发者应谨慎处理这些语句,避免陷入死循环。 #### ORDER BY的重要性 当需要返回有序数据时,明确指定`ORDER BY`子句是必要的。否则,返回的结果集可能因查询优化器的选择而变化,导致不一致的数据呈现。 ### ...
然而,由于数据之间的相互约束关系,简单的删除操作可能会导致死循环,因此需要采取特定的方法来安全地完成这一任务。本文将详细介绍如何使用SQL Server中的非公开存储过程sp_MSForEachTable来实现这一目标。 首先...
为了解决这个问题,我们需要将触发器设置为在操作之前执行(BEFORE),这样在数据被实际写入表之前就完成分类计算,避免了死循环。 以下是修正后的MySQL触发器定义: ```sql delimiter && CREATE TRIGGER trg_...
可以对多个表进行操作,但需避免引起死循环。触发器和触发它的语句通常在一个事务中。 10. **xp_logininfo函数**:此函数用于查看登录账户的信息,包括权限和访问控制。 11. **触发器描述**:触发器代码不能通过...
16 <br>0033 Return语句的使用 17 <br>0034 如何实现无限循环 17 <br>0035 巧用foreach语句控制控件 18 <br>0036 有效使用switch case语句 18 <br>2.3 运算符 19 <br>0037 如何使用...
7. SQL Server中的游标允许逐行处理查询结果。每个游标有当前行指针,未指定INSENSITIVE则游标会反映对基础数据的更新。当FETCH_STATUS为0时,意味着游标超出结果集范围。关闭游标后,可以重新打开。 【死锁处理】 ...
70. SQLSERVER数据截取:使用TOP关键字或ROW_NUMBER()窗口函数。 71. 当前日期:在Java中用new Date()获取,或SimpleDateFormat格式化日期。 以上只是部分面试题的解答,实际面试中还会涉及更多深入的技术细节和...