Возможно ли, и если да, как получить удаленный IP-адрес пользователя, выполняющий запрос, аналогично, поскольку мы можем получить имя пользователя с помощью: SUSER_SNAME()
?
Обновление для баунти. Я ищу решение, которое позволяет захватить IP-адрес обычного смертного пользователя, а не владельца db. Идеи, предложенные TheGameiswar или njc, не позволяют зафиксировать IP-адрес пользователя, которому предоставлено только разрешение execute
. Однако они - отличные идеи, чтобы начать с проблемы. Здесь я перечисляю сущность идей:
Пожалуйста, смотрите следующую последовательность:
create procedure MyStoredProcedure as
select client_net_address
from sys.dm_exec_connections
where session_id = @@SPID
Теперь добавьте пользователя и предоставите разрешение:
CREATE LOGIN [user_mortal_jack] WITH PASSWORD=N'LongYouLive!!!';
GRANT EXECUTE ON MyStoredProcedure TO [user_mortal_jack];
Когда я запускаю процедуру с запросом:
EXECUTE AS USER = 'user_mortal_jack'
exec MyStoredProcedure
REVERT
Я получаю сообщение об ошибке:
Выполняемый модуль не доверен. Либо владельцу базы данных модуля должно быть предоставлено разрешение на аутентификацию, либо модуль должен быть подписан цифровой подписью.
Я получу это сообщение, даже если я дам дополнительное разрешение:
grant VIEW SERVER STATE to [user_mortal_jack];
Если я изменил начало хранимой процедуры на:
create procedure MyStoredProcedure
with execute as OWNER as
В итоге я получаю разные ошибки:
Не удалось получить информацию о группе пользователей Windows/blahblah\admin_user, код ошибки 0x534.
Обновление после баунти. Bounty отправляется в Hadi для этой единственной строки кода, скрытой в их ответе:
CONNECTIONPROPERTY('client_net_address')
который позволяет захватывать IP-адрес любого смертного пользователя без предоставления каких-либо дополнительных прав пользователю или установки опции db TRUSTWORTHY ON и даже создания процедуры WITH EXECUTE AS OWNER
. Браво! Спасибо всем за участие.