2017-02-19 86 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