Sql server &引用;作为“执行”;在存储过程中不';不适用于;OPENROWSET";
我正在尝试在存储过程中打开xlsx文件。当我在schema应用程序中执行过程,但使用execute as dbo时: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_
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之外具有适当的权限。