Sql server &引用;作为“执行”;在存储过程中不';不适用于;OPENROWSET";

Sql server &引用;作为“执行”;在存储过程中不';不适用于;OPENROWSET";,sql-server,tsql,stored-procedures,Sql Server,Tsql,Stored Procedures,我正在尝试在存储过程中打开xlsx文件。当我在schema应用程序中执行过程,但使用execute as dbo时: 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_

我正在尝试在存储过程中打开xlsx文件。当我在schema应用程序中执行过程,但使用execute as dbo时:

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
我得到了这个错误:

对远程服务器的访问被拒绝,因为当前安全上下文不受信任


但dbo模式中的过程没有“作为dbo执行”就可以很好地工作。为什么?我找到了解决办法。首先,我在Windows Server中创建了用户“app”,并授予了对包含文件的文件夹的权限。接下来在ssms中创建新的“应用程序”凭据并映射到“应用程序”登录。然后我不得不修改程序:

EXECUTE AS CALLER
EXECUTE sp_executesql @SQLString = @v_OPEN_ROWSET
REVERT

dbo
在数据库本身中具有无限权限。但是,您并没有尝试访问数据库中的数据,也没有尝试访问SQL server中的数据。因此,SQL server上的权限与此无关。希望执行上述操作的人员必须具有SQL server之外的权限(即使文件位于同一台计算机/物理计算机上)才能访问
@p\u file\u位置
dbo
是一个系统帐户,只有SQL server知道,Windows之外不知道。但是Windows(!)处理对
@p_FILE_LOCATION
的权限。简言之:Windows(可能是active directory)必须信任SQL,并且SQL帐户必须在Windows文件系统内的SQL之外具有适当的权限。