我有一個存儲過程:S1.ProcA - S1是模式 - ProcA訪問dbo模式中的表dbo.T1。表格處於不同模式時通過存儲過程訪問表格
我想USER1,以便能夠通過S1.ProcA訪問dbo.T1 - 我給S1.ProcA EXEC訪問權限,但是,它有錯誤「選擇權限被拒絕在dbo.T1 ......」
如何通過proc S1.ProcA將user1的訪問權限授予表dbo.T1,而不直接授予對錶的訪問權限?
謝謝。
我有一個存儲過程:S1.ProcA - S1是模式 - ProcA訪問dbo模式中的表dbo.T1。表格處於不同模式時通過存儲過程訪問表格
我想USER1,以便能夠通過S1.ProcA訪問dbo.T1 - 我給S1.ProcA EXEC訪問權限,但是,它有錯誤「選擇權限被拒絕在dbo.T1 ......」
如何通過proc S1.ProcA將user1的訪問權限授予表dbo.T1,而不直接授予對錶的訪問權限?
謝謝。
您可以使用EXECUTE AS指定運行存儲過程的安全上下文的另一個用戶。
CREATE PROCEDURE your_proc
WITH EXECUTE AS 'user_with_permission_on_schema'
AS SELECT * FROM your_schema.your_table
所以,如果你有一個登錄/用戶具有由您可以使用登錄/用戶執行存儲過程,而不是調用者的PROC引用的對象上相應的權限。
如果您想在管理控制檯中使用權限,則可以使用EXECUTE AS USER = 'user'
和REVERT
(回到常規登錄)命令在測試時更改安全上下文。
SQL Server安全性是一個複雜的話題,我建議你通過documentation仔細閱讀,因爲這可能不是你想要採取太多的機會在一個地區
是如何工作的一個例子:
-- create schemas, table, users, proc and grant permissions
CREATE SCHEMA demo_s1
GO
CREATE SCHEMA demo_s2
GO
CREATE USER [schema_s1_owner] WITHOUT LOGIN WITH DEFAULT_SCHEMA=[demo_s1]
GO
CREATE USER [schema_s2_user] WITHOUT LOGIN WITH DEFAULT_SCHEMA=[demo_s2]
GO
CREATE TABLE demo_s1.your_table (column1 int)
INSERT demo_s1.your_table VALUES (1),(2),(3)
GO
GRANT SELECT ON demo_s1.your_table TO [schema_s1_owner]
GO
CREATE PROCEDURE select_from_s1_your_table
WITH EXECUTE AS 'schema_s1_owner'
AS SELECT * FROM demo_s1.your_table
GO
GRANT EXECUTE ON select_from_s1_your_table TO [schema_s2_user]
GO
-- try executing as limited user
EXECUTE AS USER = 'schema_s2_user' -- change security context
SELECT * FROM demo_s1.your_table -- this will fail with 'SELECT permission was denied'
GO
EXEC select_from_s1_your_table -- this will work and return results
GO
REVERT -- go back to the ordinary login and clean up
GO
-- clean up
DROP TABLE demo_s1.your_table
GO
DROP PROC select_from_s1_your_table
GO
DROP USER [schema_s2_user]
GO
DROP USER [schema_s1_owner]
GO
DROP SCHEMA demo_s1
GO
DROP SCHEMA demo_s2
GO
謝謝我將執行EXECUTE AS – user1967701 2014-09-05 20:09:39
@ user1967701我添加了一個示例腳本來演示如何工作。該腳本添加了一些東西,然後將其刪除。 – jpw 2014-09-05 20:15:31
SQL Serve 2008數據庫。所有的對象都在同一個數據庫中。 – user1967701 2014-09-05 19:25:08
解決方案可能是在與過程相同的模式中創建視圖,然後授予對視圖的訪問權限,而不是表格 – 2014-09-05 19:32:43
您也可以嘗試存儲過程代碼中的「EXECUTE AS」子句。 – 2014-09-05 19:37:44