Динамическая c SQL массовая вставка не может открыть файл, но у вызывающей стороны есть разрешения - PullRequest
0 голосов
/ 26 марта 2020

У меня есть 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 не должно быть доступа.

...