Могу ли я передать аргументы внешнему (CLR) триггеру SQL Server?

У меня есть триггер в SQL Server, но мне нужно передать аргументы в код CLR, т. Е. Информацию, не предоставленную в контексте триггера.

Возможно ли что-то подобное?

CREATE TRIGGER MyTrigger ON MyTable FOR INSERT
AS EXTERNAL NAME MyAssembly.MyNamespace.MyTriggerHandler("Foo", "Bar")

Эти аргументы были бы статичными, конечно.

Число перестановок аргументов является дискретным, но создание отдельного класса или функции в сборке CLR для каждого было бы громоздким и потребовало бы этапа компиляции / развертывания, который я хочу избегать каждый раз, когда требуется другой триггер.

3 ответа

Решение

После небольшого исследования выясняется, что то, что я хочу сделать, не может быть сделано.

Методы, передаваемые с использованием условия триггера "внешнее имя", должны быть без параметров, и SqlTriggerContext нельзя изменить в операторе CREATE TRIGGER.

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

В некотором смысле вы можете передавать информацию в Trigger (будь то T-SQL или SQLCLR), но не напрямую, как показано в вопросе. Тем не менее, у вас есть 2 или 3 варианта передачи информации, которая не является частью самой операции DML, каким-либо триггерам в цепочке событий:

  1. Локальная временная таблица
  2. SET CONTEXT_INFO / CONTEXT_INFO
  3. В SQL Server 2016 или новее: sp_set_session_context / SESSION_CONTEXT

Во всех случаях вы получите значения, выполнив SqlCommand (использование "Context Connection = true;" в качестве строки подключения) с выходом SqlParameter вытащить значение в код.NET.

Да, вы можете использовать процедуры sp_OA для этого: http://msdn.microsoft.com/en-us/library/aa238863(SQL.80).aspx

Другие вопросы по тегам