Мой клиент только что обновился с SQL Server 2000 до SQL Server 2016. Одна хранимая процедура, используемая 15-20 раз в день, просматривает таблицу имен файлов и отчеты для каждого о том, существует ли она.
Раньше он использовал xp_FileExist
, но теперь, кажется, требует использования прав администратора. Я не могу предоставить всем 176 пользователям права администратора и сохранить мою работу.
Я нашел статьи, предлагающие использование GRANT IMPERSONATE
и EXECUTE AS USER
, но не могу заставить его работать.
-- Old code works only for administrators
-- non-administrators ALWAYS get 0 for result even when file exists
EXEC master.dbo.xp_fileexist @docUNC, @FileExists OUTPUT
-- code run using admin account
SELECT SUSER_NAME() LOGIN_Name, USER_NAME() username;
Результаты
LOGIN_Name username
--------------------------------------
DomainName\potomcandice dbo
-- attempted new code for grant impersonate (want to let maronj impersonate potomcandice)
GRANT IMPERSONATE ON USER:: maronj TO potomcandice
-- New code
EXECUTE AS USER='potomcandice'
EXEC master.dbo.xp_fileexist @docUNC, @FileExists OUTPUT
По-прежнему получают 0 для результата, даже если файл существует.
Надеясь на предложения относительно а) как использовать «Предоставить олицетворение» и «Выполнить как пользователь /Войти "или б) альтернативы xp_fileexist, которые не включают xp_commandshell.