Существует очень простой способ найти имя базы данных, в которой запускается SQLCLR Trigger: просто установите соединение с Context Connection и получите свойство Database
. Вам даже не нужно выполнять запрос: -).
Следующее должно работать во всех типах объектов SQLCLR (хранимая процедура, функция, определяемый пользователем агрегат, определяемый пользователем тип и триггер):
string _DatabaseName;
using (SqlConnection _Connection = new SqlConnection("Context Connection = true;"))
{
_Connection.Open();
_DatabaseName = _Connection.Database;
}
Вот и все! Я только что попробовал это в SQLCLR Trigger, и он отлично работает.
Еще одна вещь, о которой следует помнить при ограничении триггеров, запускающих другие триггеры, - это функция TRIGGER_NESTLEVEL . Это лучше работает в триггерах T-SQL, где доступно значение @@PROCID
и содержит [object_id]
триггера. Таким образом, в триггерах T-SQL вы можете ограничить рекурсию каждого триггера в отдельности, но при этом разрешить триггерам запускать другие триггеры в других таблицах.
В SQLCLR его все еще можно использовать, но без имени триггера вы можете ограничить только все триггеры. Это означает, что вы можете предотвратить запуск любого Триггера любым другим Триггером в любой Таблице, в том числе в той же Таблице, но нет способа ограничить срабатывание только того же Триггера, одновременно разрешив запуск Триггеров для других таблиц, которые могут быть модифицирован соответствующим триггером. Просто используйте Context Connection и запустите SELECT TRIGGER_NESTLEVEL();
через SqlCommand.ExecuteScalar()
.