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();
        }
    }
}

CLR触发器仅更新特定列

您不能阻止选择性地运行触发器,无论更新了哪些列,它都将始终运行。然而,一旦启动,您可以咨询COLUMNS_UPDATED()功能:

返回指示表中列的varbinary位模式或插入或更新的视图。使用COLUMNS_UPDATED位于Transact-SQL INSERT或UPDATE触发器主体内的任何位置测试触发器是否应该执行某些操作。

因此,您可以根据更新的列来调整触发逻辑,使其具有适当的操作。

也就是说,从SQLCLR调用WCF是一个非常非常糟糕的主意。从触发器调用WCF更糟糕。您的服务器将在生产中失效,因为事务将阻塞/中止,等待某个HTTP响应爬回网络。更不用说,在回滚的情况下,您的调用本质上是不正确的,因为您无法撤消HTTP调用。执行此类操作的正确方法是通过队列将操作和WCF调用解耦。您可以将表用作队列,也可以使用真正的队列或使用更改跟踪。其中任何一个都允许您将更改和WCF调用解耦,并允许您从单独的进程进行调用,而不是从SQLCLR 进行调用