Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# CLR触发器仅更新特定列_C#_Sql Server_Sqlclr - Fatal编程技术网

C# CLR触发器仅更新特定列

C# CLR触发器仅更新特定列,c#,sql-server,sqlclr,C#,Sql Server,Sqlclr,每当一个新文件插入到我的表中,然后将值传递给我的WCF服务时,我就编写了一个clr触发器,现在我必须将该过程更改为“更新”,只有特定列得到更新,然后我必须从其他两个表中提取值 我只是想知道这是无论如何我可以启动clr触发器只是特定的列得到更新 像这样的场景 表1:客户详细信息(客户编号、客户名称、描述) 表2:地址(门牌号、街道、城市、州) 在这里,我试图做的是,如果表1中的“Desc”列被更新,那么clr触发器将被触发,并根据“Desc”传递表1和表2中的所有值 以下是我的插入代码: [Mic

每当一个新文件插入到我的表中,然后将值传递给我的WCF服务时,我就编写了一个clr触发器,现在我必须将该过程更改为“更新”,只有特定列得到更新,然后我必须从其他两个表中提取值

我只是想知道这是无论如何我可以启动clr触发器只是特定的列得到更新

像这样的场景

表1:客户详细信息(客户编号、客户名称、描述)
表2:地址(门牌号、街道、城市、州)

在这里,我试图做的是,如果表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();
        }
    }
}

您不能阻止有选择地运行触发器,无论列是否更新,触发器都将始终运行。但是,一旦启动,您可以咨询该功能:

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

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


尽管如此,从SQLCLR调用WCF是一个非常糟糕的主意。从触发器调用WCF更糟糕。您的服务器将在生产过程中死机,因为事务将阻止/中止等待某个HTTP响应,以便通过网络重新爬网。更不用说,在回滚的情况下,您的调用本质上是不正确的,因为您无法撤消HTTP调用。执行此类操作的正确方法是通过队列将操作和WCF调用解耦。你可以用,你可以用,或者你可以用。其中任何一个都允许您将更改与WCF调用分离,并允许您从单独的进程而不是从SQLCLR进行调用,非常感谢您的评论,那么,处理这种情况的最佳方法是什么?您通知的是什么?我通过本地机器中的clr触发器调用wcf,解决了所有问题,但您的回答让我对prod环境感到非常害怕,因此,我想从c#side购买windows服务或任何其他替代方案。你建议的方式我对这些并不熟悉,但我完成更改触发过程的时间有限。