CLR Trigger только определенный столбец обновляется - PullRequest
2 голосов
/ 23 февраля 2012

Я написал триггер clr всякий раз, когда новый файл вставляется в мою таблицу, а затем передаю значение моей службе WCF, теперь мне нужно изменить процесс, чтобы «обновлять» только конкретный столбец, который обновляется, тогда мне нужно тянутьзначение из двух других таблиц.

Мне просто интересно, так или иначе, я могу запустить триггер clr только для обновления определенного столбца?

Сценарий, подобный этому

Таблица1: Данные клиента (Cust.No, Cust.Name, Desc)
Таблица 2: Адрес (DoorNo, Street, City, State).

Вот что я пытаюсь сделать, если "Desc"столбец в Table1 обновляется, затем запускается триггер clr и передаются все значения в Table1 и Table2 на основе «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 Ответ

3 голосов
/ 23 февраля 2012

Вы не можете предотвратить выборочный запуск триггера, он всегда будет работать независимо от того, обновлены ли столбцы.Однако после запуска вы можете обратиться к функции COLUMNS_UPDATED():

Возвращает битовый шаблон varbinary, который указывает столбцы в таблице или представлении, которые были вставлены или обновлены.COLUMNS_UPDATED используется в любом месте тела триггера INSERT или UPDATE Transact-SQL, чтобы проверить, должен ли триггер выполнять определенные действия.

Таким образом, вы должны настроить логику триггера таким образом, чтобы соответствующие действия соответствовали столбцамгде обновлено.

При этом вызов WCF из SQLCLR - очень и очень плохая идея.Вызов WCF из триггера еще хуже.Ваш сервер умрет в работе, поскольку транзакции будут блокировать / прерывать ожидание какого-либо HTTP-ответа для сканирования по сети.Не говоря уже о том, что ваши вызовы по своей сути некорректны при наличии откатов, поскольку вы не можете отменить HTTP-вызов.Правильный способ выполнения таких действий - разделить операцию и вызов WCF с помощью очереди.Вы можете сделать это с таблицами, используемыми в качестве очередей , вы можете использовать истинные очереди или вы можете использовать Отслеживание изменений .Любой из них позволит вам отделить изменения и вызов WCF, а также сделать вызов из отдельного процесса, а не из SQLCLR

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...