Могу ли я передать аргументы внешнему (CLR) триггеру SQL Server? - PullRequest
1 голос
/ 15 июля 2009

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

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

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

Конечно, эти аргументы будут статичными.

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

Ответы [ 3 ]

1 голос
/ 16 июля 2009

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

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

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

1 голос
/ 03 января 2017

В некотором смысле вы можете передавать информацию в триггер (будь то 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.

0 голосов
/ 15 июля 2009

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

...