2017-02-19 89 views
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”完美的作品精细。为什么?

+0

'dbo'在数据库本身内具有无限制的权限。然而,你不是试图访问数据库中的数据,也不是SQL服务器中的数据。所以,在SQL服务器上的权限是没有关系的。希望执行上述操作的人员必须拥有SQL服务器之外的权限(即使该文件位于同一台机器/物理计算机上)以访问“@ p_FILE_LOCATION”。 'dbo'是一个只有SQL服务器才知道的系统帐户,但不在Windows之外。但是Windows(!)是处理'@ p_FILE_LOCATION'权限的人。 – Ralph

+0

简而言之:Windows(可能是活动目录)必须信任SQL,并且SQL帐户必须具有Windows文件系统内SQL以外的适当权限。 – Ralph

回答

0

我找到了一个解决方案。首先,我在Windows Server中创建了用户“app”,并授予文件夹的权限。接下来,在ssms中创建新的“应用程序”凭据并映射到“应用程序”登录。然后我必须修改程序:

EXECUTE AS CALLER 
EXECUTE sp_executesql @SQLString = @v_OPEN_ROWSET 
REVERT