gpt4 book ai didi

c# - CLR 触发器只更新特定的列

转载 作者:行者123 更新时间:2023-11-30 22:31:04 25 4
gpt4 key购买 nike

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

我只是想知道这是不是我只能启动 clr 触发器,只有特定的列得到更新?

场景是这样的

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

这里我想做的是,如果 Table1 中的“Desc”列得到更新,则会触发 clr 触发器并根据“Desc”传递 Table1 和 Table2 中的所有值。

这是我的插入代码:

[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()功能:

Returns a varbinary bit pattern that indicates the columns in a table or view that were inserted or updated. COLUMNS_UPDATED is used anywhere inside the body of a Transact-SQL INSERT or UPDATE trigger to test whether the trigger should execute certain actions.

因此,您可以根据更新的列调整触发逻辑以采取适当的操作。

也就是说,从 SQLCLR 调用 WCF 是一个非常非常糟糕的主意。从触发器调用 WCF 更糟。您的服务器将在生产中死机,因为事务将阻止/中止等待某些 HTTP 响应以通过网络爬回。更不用说您的调用在存在回滚的情况下本质上是不正确的,因为您无法撤消 HTTP 调用。执行此类操作的正确方法是通过队列将操作与 WCF 调用分离。你可以用 tables used as queues 来做到这一点, 你可以使用 true queues或者你可以使用 Change Tracking .这些中的任何一个都允许您将更改和 WCF 调用分离,并允许您从单独的进程而不是 SQLCLR 进行调用

关于c# - CLR 触发器只更新特定的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9404533/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com