У меня есть SQL Сервер, работающий на машине1. На machine2 есть папка общего ресурса, в которой содержится текстовый файл, который я хочу выполнить массовой вставкой с помощью хранимой процедуры с использованием Dynami c SQL (упрощенно) - без операторов EXECUTE AS
:
CREATE PROCEDURE [schema].[run_bulk_insert]
@UploadFileName VARCHAR(100)
AS
BEGIN
BEGIN TRY
BEGIN TRAN
DECLARE @sql NVARCHAR(4000) = 'BULK INSERT #temp_table
FROM ' + QUOTENAME(@FileName) + '
WITH
(
FIELDTERMINATOR ='','',
ROWTERMINATOR =''\n''
)';
EXEC(@sql);
COMMIT TRAN
END TRY
BEGIN CATCH
ROLLBACK TRAN
declare @ErrorMessage nvarchar(max), @ErrorSeverity int, @ErrorState int;
select @ErrorMessage = ERROR_MESSAGE() + ' Line ' + cast(ERROR_LINE() as nvarchar(5)),
@ErrorSeverity = ERROR_SEVERITY(), @ErrorState = ERROR_STATE();
raiserror (@ErrorMessage, @ErrorSeverity, @ErrorState);
END CATCH
END
GO
I получаю следующую ошибку:
Невозможно выполнить массовую загрузку, поскольку файл "путь \ имя_файла.txt" не может быть открыт. Код ошибки операционной системы 5 (доступ запрещен).
Пользователь домена user1 имеет встроенный логин сервера безопасности и принадлежит к роли базы данных администратора. user1 не должен иметь доступа к базовым таблицам. Пользователь user1 также имеет доступ к текстовому файлу на machine2 (может открыть его).
Я также попытался войти в свой домен и получил ту же проблему. Я являюсь администратором домена и SQL системным администратором сервера.
Не работает ли Dynami c SQL с разрешениями вызывающего абонента внутри хранимой процедуры? Сервер SQL работает с виртуальной (локальной) учетной записью NT Service \ MSSQL $ имя_экземпляра, поэтому я не могу дать разрешения этой учетной записи для другого блока. Мне пришлось бы использовать учетную запись службы домена, которую я бы предпочел избежать.
Если этот динамик c SQL не использует разрешения вызывающих абонентов? Фактическая процедура также имеет операции crud над базовыми таблицами, к которым у user1 не должно быть доступа.