下面的代码位于存储过程中,并在user:premfguser下运行时出现以下错误。 拒绝访问远程服务器,因为当前的安全上下文不受信任。
SET @provider = 'Microsoft.Jet.OLEDB.4.0'
SET @ExcelString = 'Excel 8.0;Database=' + @fn
EXEC('INSERT INTO OPENROWSET(''' + @provider + ''',''' + @ExcelString + ''',''SELECT * FROM [Sheet1$A2:L2]'')
SELECT [ITEMNUMBER],'''',[ITEM_DESCRIPTION],[CASEPACK],[UNIT PRICE],[CASE PRICE],[WEIGHT],[CUBE],[CASE DIMS],[UPC],[CASE UPC],[Q Comments] FROM [ORDER SUMMERY] WHERE [Order #] = ''' + @OrderNumber + '''')
当我将预处理器添加到sysadmin时,它可以工作。如何在不将sysadmin永久性地提供给premfguser的情况下运行此代码?
答案 0 :(得分:2)
使用EXECUTE AS 和使用证书对过程进行签名。有关如何签署程序的信息,请参阅this example,另请参阅本文Signing Procedures with Certificates和此Tutorial: Signing Stored Procedures with a Certificate。
请注意,标记数据库TRUSTWORTHY的替代方法意味着数据库的dbo
是事实上的sysadmin
,因为如果设置了可靠的位,他可以随时将自己升级到sysadmin 。代码签名是一个更好的选择,但要复杂得多。
答案 1 :(得分:1)
定义存储过程时,请添加EXECUTE AS
子句:
CREATE PROCEDURE SomeProcedure
WITH EXECUTE AS 'UserName'
AS BEGIN
-- procedure code as usual...
END;