我在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是在当前用户的权限下执行的,即使在存储过程中也是如此,因此这不是问题。可以从machine1访问共享文件夹吗?您可以登录并使用Windows资源管理器打开它吗?SQL Server需要访问该文件,因此只要machine1上存在共享文件夹,您就可以指向machine2。希望有道理