在使用SQL Server时,有时候希望针对数据表中某一字段的修改执行一段触发器代码,比如修改了人员名称时,我们希望数据库会自动执行一代码来修改同一数据表中的姓名拼音首字母字段。如果使用After Update触发器则会让SQL Server崩溃掉,那么有什么办法可以避免这种死循环吗?答案是肯定的,我可以在触发器中判断用户是否修改了姓名字段,如果是则执行后续更新代码,如果用户修改了其他字段,则不执行任何代码。
假设有一张表存储客户的信息,第一个字段是Visitor_ID,第二个字段Visitor_Name,第三个字段是Visitor_PY_Code。我们针对新增和更新动作写两个触发器。
针对新增的触发器很容易写,现在的问题是在更新的触发器,如果再使用Update语句就会循环执行触发器了,系统会崩溃掉的。我们希望只针对单一字段的更新执行触发器。还好SQL提供了COLUMNS_UPDATED()函数,能够判断出哪一字段被更新。于是将更新的触发器写成如下:
CREATE
TRIGGER
UpdatePYCodeOnly
Visitor
UPDATE
(COLUMNS_UPDATED()
BEGIN
declare
@VisitorID
@NameStr
nvarchar
Select
@VisitorID
Visitor_ID,
@NameStr
Visitor_Name
Inserted
Update
Visitor
NamePINYIN
dbo.GetPYCode(
@NameStr
Where
Visitor_ID
@VisitorID
在使用
COLUMNS_UPDATED()
函数需要注意以下几点
:
-
表中第一个字段序号为0,第二个字段序号为1,依此类推
-
表中的字段顺序不要改动
两张用户表,修改其中一张表a的密码字段,另一张表b也同时更新字段。同理的,修改表b的密码字段,另一张表a也同时更新字段。分别为两张表创建
触发器
,这样就会出现,
两个
触发器
会陷入
死循环
,处理方法如下: CREATE TABLE [T_users](
[yhbm] [varchar](20) NOT NULL,
[pwd] [varchar](20) NULL)CREATE TABLE [dbo]...
SQL
Server
触发器
没有执行
在日常的
数据库
开发中,我们经常会使用
触发器
(Trigger)来实现在特定的数据变化时自动执行一些操作。然而有时候会出现
触发器
没有执行的情况,导致我们的业务逻辑无法顺利执行。那么,究竟是什么原因导致了这种情况呢?本文将介绍一些可能的原因,并提供解决方案。
1.
触发器
未启用
设置重复执行
SQL
语句或语句块的条件。 只要指定的条件为真,就重复执行语句。 可以使用 BREAK 和 CONTINUE 关键字在循环内部控制 WHILE 循环中语句的执行。
-- Syntax for
SQL
Server
and Azure
SQL
Database
WHILE Boolean_expression
{
sql
_statement | statement_block | BREAK | CONTINUE }
Boolean_expressi...
语句被终止。完成执行语句前已用完最大递归;
A result set was generated for update;
The statement did not return a result set;
Error encountered when performing Introspect database: 不支持“variant”数据类型