CLR触发器仅更新特定列
本文关键字:更新 触发器 CLR | 更新日期: 2023-09-27 18:25:25
每当有新文件插入到我的表中时,我都会编写一个clr触发器,然后将值传递给我的WCF服务,现在我必须将过程更改为"更新",只有特定的列得到更新,然后我必须从其他两个表中提取值。
我只是想知道这是不是我可以启动clr触发器,只更新特定的列?
类似的场景
表1:客户详细信息(客户编号、客户名称、描述)
表2:地址(DoorNo,Street,City,State)。
在这里,我要做的是,如果表1中的"Desc"列得到更新,那么clr触发器就会被触发,并根据"Desc"传递表1和表2中的所有值。
这是我的插入代码:
[Microsoft.SqlServer.Server.SqlTrigger(Name = "WCFTrigger",Target = "tbCR", Event = "FOR UPDATE, INSERT")]
public static void Trigger1()
{
SqlCommand cmd;
SqlTriggerContext myContext = SqlContext.TriggerContext;
SqlPipe pipe = SqlContext.Pipe;
SqlDataReader reader;
if(myContext.TriggerAction== TriggerAction.Insert)
{
using (SqlConnection conn = new SqlConnection(@"context connection=true"))
{
conn.Open();
//cmd = new SqlCommand(@"SELECT * FROM tbCR", conn);
cmd = new SqlCommand(@"SELECT * FROM INSERTED", conn);
reader = cmd.ExecuteReader();
reader.Read();
//get the insert value's here
string Cust.No, Cust.Name,Desc;
Cust.No = reader[0].ToString();
Cust.Name = reader[1].ToString();
Desc = reader[2].ToString();
myclient.InsertOccured(Cust.No, Cust.Name,Desc);
reader.Dispose();
}
}
}
您不能阻止选择性地运行触发器,无论更新了哪些列,它都将始终运行。然而,一旦启动,您可以咨询COLUMNS_UPDATED()
功能:
返回指示表中列的varbinary位模式或插入或更新的视图。使用COLUMNS_UPDATED位于Transact-SQL INSERT或UPDATE触发器主体内的任何位置测试触发器是否应该执行某些操作。
因此,您可以根据更新的列来调整触发逻辑,使其具有适当的操作。
也就是说,从SQLCLR调用WCF是一个非常非常糟糕的主意。从触发器调用WCF更糟糕。您的服务器将在生产中失效,因为事务将阻塞/中止,等待某个HTTP响应爬回网络。更不用说,在回滚的情况下,您的调用本质上是不正确的,因为您无法撤消HTTP调用。执行此类操作的正确方法是通过队列将操作和WCF调用解耦。您可以将表用作队列,也可以使用真正的队列或使用更改跟踪。其中任何一个都允许您将更改和WCF调用解耦,并允许您从单独的进程进行调用,而不是从SQLCLR 进行调用