Могу ли я передать аргументы внешнему (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, каким-либо триггерам в цепочке событий:
- Локальная временная таблица
- SET CONTEXT_INFO / CONTEXT_INFO
- В 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