0
我试图在存储过程中打开xlsx文件。当我在执行过程中的架构的应用程序,但执行的DBO:存储过程中的“执行”不适用于“OPENROWSET”
ALTER PROCEDURE [app].[Compare] (
@p_CPN_ID int,
@p_FILE_LOCATION nvarchar(max)
)
WITH EXECUTE AS 'dbo'
AS
BEGIN
BEGIN TRY
DELETE FROM dbo.IMPORT
DECLARE @v_OPEN_ROWSET NVARCHAR(MAX)
SET @v_OPEN_ROWSET = 'INSERT INTO dbo.IMPORT
SELECT * FROM OPENROWSET(''Microsoft.ACE.OLEDB.12.0'',''Excel 8.0;HDR=YES;Database=' + @p_FILE_LOCATION + ''',''select * from [Arkusz1$]'')'
EXECUTE sp_executesql @SQLString = @v_OPEN_ROWSET
END TRY
BEGIN CATCH
declare @err nvarchar(max)
set @err = ERROR_MESSAGE()
RAISERROR(@err,16,1)
RETURN 1
END CATCH
END
我得到这个错误:
Access to the remote server is denied because the current security context is not trusted.
,但过程中的dbo架构没有“执行为DBO”完美的作品精细。为什么?
'dbo'在数据库本身内具有无限制的权限。然而,你不是试图访问数据库中的数据,也不是SQL服务器中的数据。所以,在SQL服务器上的权限是没有关系的。希望执行上述操作的人员必须拥有SQL服务器之外的权限(即使该文件位于同一台机器/物理计算机上)以访问“@ p_FILE_LOCATION”。 'dbo'是一个只有SQL服务器才知道的系统帐户,但不在Windows之外。但是Windows(!)是处理'@ p_FILE_LOCATION'权限的人。 – Ralph
简而言之:Windows(可能是活动目录)必须信任SQL,并且SQL帐户必须具有Windows文件系统内SQL以外的适当权限。 – Ralph