CLR триггер обновляется только определенный столбец
Я написал триггер clr всякий раз, когда новый файл вставляется в мою таблицу, а затем передает значение в мою службу WCF, теперь я должен изменить процесс на "обновить" только определенный столбец обновляется, затем я должен вытащить значение из других двух таблиц.
Мне просто интересно, это в любом случае я могу запустить триггер clr только только конкретный столбец обновляется ?
Сценарий такой
Таблица 1: Сведения О Клиенте (Cust.No, Cust.Name, Desc)
Таблица 2: Адрес (DoorNo, Улица, Город, Штат).
Вот что я пытаюсь сделать, если столбец " Desc "в Таблице 1 обновляется, то триггер clr срабатывает и передает все значения в Таблице 1 и Таблице 2 на основе"Desc".
Вот мой код для вставки:
[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();
}
}
}
1 ответ:
Вы не можете запретить запуск триггера выборочно, он всегда будет выполняться независимо от того, какие столбцы обновляются. Тем не менее, после запуска вы можете проконсультироваться с
COLUMNS_UPDATED()функция:Возвращает битовый шаблон varbinary, который указывает столбцы в таблице или представления, которые были вставлены или обновлены. Использовать функции columns_updated является в любом месте тела триггера Transact-SQL INSERT или UPDATE для проверьте, должен ли триггер выполнять определенные действия.
Так что вы бы отрегулируйте логику триггера, чтобы иметь соответствующее действие в соответствии с тем, какие столбцы обновляются.
Как говорится, вызов WCF из SQLCLR-очень и очень плохая идея. Вызов WCF из триггера еще хуже. Ваш сервер умрет в процессе работы, так как транзакции будут блокировать / прерывать ожидание некоторого ответа HTTP, чтобы вернуться по проводу. Не говоря уже о том, что ваши вызовы изначально некорректны при наличии отката, так как вы не можете отменить вызов HTTP. Правильный способ совершать такие действия - это разделите операцию и вызов WCF с помощью очереди. Вы можете сделать это с таблицами , используемыми в качестве очередей, Вы можете использовать истинные очереди или вы можете использовать отслеживание изменений. Любой из них позволит вам отделить изменение и вызов WCF и позволит вам сделать вызов из отдельного процесса, а не из SQLCLR
Comments