如何临时给用户sysadmin?

时间:2011-08-29 19:11:27

标签: sql-server stored-procedures

下面的代码位于存储过程中,并在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的情况下运行此代码?

2 个答案:

答案 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;