#sql #sql-server
#sql #sql-сервер
Вопрос:
Я пишу av analytical стандартное решение register из допинг-лаборатории, в которой я работаю, и застрял на проблеме, как получить ip-адрес клиента в таблицу аудита.
Я нашел прямой метод для фактического получения ip-адреса в Интернете, и мой вопрос не об этом.
У меня есть триггеры для каждой таблицы, вставляющей записи в таблицу аудита, и я не хочу изменять вставку ip-адреса вручную в каждом триггере. Я хотел бы, чтобы что-то вроде ограничения по УМОЛЧАНИЮ выполняло фактическую вставку ip-адреса, но при попытке я получаю ошибки о недопустимых вложенных запросах.
Вот способ получить адрес,
SELECT client_net_address
FROM sys.dm_exec_connections
WHERE (session_id = @@SPID)
Ответ №1:
Вы можете использовать функцию SQL в качестве ограничения по УМОЛЧАНИЮ
http://msdn.microsoft.com/en-us/library/ms186755.aspx.
Если использования SQL недостаточно, вы можете использовать функцию CLR в качестве ограничения по умолчанию.
Комментарии:
1. Интересно, что такое поведение вообще не задокументировано, но, по крайней мере, в SQL 2008 у меня это сработало: я мог использовать скалярную функцию по УМОЛЧАНИЮ. Лично я бы не стал полагаться на недокументированное поведение, и я бы все равно выбрал триггерное решение, потому что с таким же успехом вы могли бы иметь всю свою логику аудита в одном месте. Но приятно знать, что это работает.
Ответ №2:
В документации указано, что ограничением по УМОЛЧАНИЮ может быть «константа, значение NULL или системная функция». Поскольку не существует системной функции, которая возвращает сетевой адрес клиента, вы не можете делать то, что хотите напрямую.
Очевидным решением здесь является триггер. Триггеры аудита часто создаются и поддерживаются автоматически из шаблона в любом случае, потому что они обычно идентичны во всех таблицах, и если вы этого еще не делаете, то, возможно, это хорошая возможность начать. Это позволило бы избежать вашей проблемы с ручным добавлением кода повсюду.