如果您使用sp_executesql
,則不能忽略用戶的權限。除非你讓程序在其他人的環境中執行。而不是選擇另一個用戶,我寧願創建一個沒有登錄的用戶。因此,讓我們假設你有一個名爲dbo.farb
表中,用戶foobarblat
不能ALTER
(DENY
是沒有必要的,但它確實證明了這一點):
USE master;
GO
CREATE LOGIN foobarblat WITH PASSWORD = 'foobarblat', CHECK_POLICY = OFF;
GO
USE YourDatabase;
GO
CREATE USER foobarblat FROM LOGIN foobarblat;
GO
CREATE TABLE dbo.farb(id INT);
GO
DENY ALTER ON dbo.farb to foobarblat;
GO
現在讓我們創建一個隱藏的用戶 - 我們可以給該用戶的所有在世界上的權限,因爲沒有人可以真正身份登錄該用戶,但在這個例子中,我們可以只授予ALTER
我們的餐桌上):
CREATE USER SuperSecret WITHOUT LOGIN;
GO
GRANT ALTER ON dbo.farb TO SuperSecret;
GO
現在我們可以寫在上下文中執行存儲過程我們SuperSecret
用戶,但可以由0執行:
CREATE PROCEDURE dbo.UpdateStats
@tablename NVARCHAR(511)
WITH EXECUTE AS 'SuperSecret'
AS
BEGIN
DECLARE @sql NVARCHAR(MAX);
SET @sql = N'UPDATE STATISTICS ' + @tablename;
EXEC sp_executesql @sql;
END
GO
GRANT EXEC ON dbo.UpdateStats TO foobarblat;
使用foobarblat
在新窗口中現在連接 - 你應該能夠執行這個沒有問題:
EXEC dbo.UpdateStats 'dbo.farb';
這聽起來像個壞主意。爲什麼不讓數據庫更新統計信息。通常情況下,如果你做大數據更新。 – JohnFx