动态SQL批量插入无法打开文件,但调用者具有权限

问题描述 投票:0回答:1

我在machine1上运行了MS SQL Server。在machine2上有一个文件夹共享,其中包含一个文本文件,我想使用动态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

我收到以下错误:Cannot bulk load because the file "path\filename.txt" could not be opened. Operating system error code 5(Access is denied).

域用户user1具有集成的安全服务器登录名,并且属于批量管理数据库角色。 user1不应该访问基础表。 user1还可以访问machine2上的文本文件(可以打开它)。

我也尝试过使用域登录并遇到同样的问题。我是域管理员和sql server sysadmin。

在存储过程中,动态sql是否不以调用方权限运行? sql server使用虚拟(本地)帐户NT Service \ MSSQL $ instancename运行,因此我无法在另一个框中授予该帐户权限。我将不得不使用域服务帐户,而我宁愿避免使用它。

此动态sql是否不使用调用者权限?实际过程在user1不应访问的基础表上也具有粗糙操作。

感谢您的帮助。

sql-server windows permissions file-permissions dynamic-sql
1个回答
0
投票

并不是真正的答案,但我没有足够的声誉来发表评论。动态sql是在当前用户的权限下执行的,即使在存储过程中也是如此,因此这不是问题。可以从machine1访问共享文件夹吗?您可以登录并使用Windows资源管理器打开它吗?SQL Server需要访问该文件,因此只要machine1上存在共享文件夹,您就可以指向machine2。希望有道理

© www.soinside.com 2019 - 2024. All rights reserved.