存储过程中的“执行为”不适用于“OPENROWSET”

时间:2017-02-19 13:44:37

标签: sql-server tsql stored-procedures

我正在尝试在存储过程中打开xlsx文件。当我在架构应用程序中执行过程时,但执行为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架构中的过程完全正常。为什么呢?

1 个答案:

答案 0 :(得分:0)

我找到了决心。首先,我创建了用户" app"在Windows Server中,并授予文件夹的权限。接下来创建新的" app" ssms中的凭据并映射到" app"登录。然后我不得不修改程序:

EXECUTE AS CALLER
EXECUTE sp_executesql @SQLString = @v_OPEN_ROWSET
REVERT