2013-08-06 41 views
5

數據庫用戶A應該只能訪問特定數據。 此數據目前提供的視圖B.VIEW1從模式BC擁有的表中選擇。是EXECUTE AS OWNER的存儲過程是從第三模式表中選擇的視圖的有效替換嗎?

CREATE VIEW [B].[VIEW1] AS SELECT * FROM [B].[VIEW2], [C].[VIEW1] 

由於C.VIEW1沒有被資,Ownership Chains適用。

這意味着儘管一個被授予選擇許可ON B.VIEW1,它不能從選​​擇。

SELECT permission denied on object 'C.VIEW1', database '...', schema '...'. 

是一個存儲過程B.PROC1EXECUTE AS OWNER Clause在安全性方面爲B.VIEW1一個有效的替代?

CREATE PROC [B.PROC1] WITH EXECUTE AS OWNER AS BEGIN SELECT * FROM [B.VIEW2], [C].[VIEW1] END 

或者是否有任何負面影響可能導致任何安全問題?

+0

討論:[SQL服務器:如何許可模式?](HTTP:/ /stackoverflow.com/questions/6509525/sql-server-2008-schema-separation-and-permissions?rq=1),[Sq​​l Server 2008架構分離和權限](http://stackoverflow.com/questions/6509525/ sql-server-2008-schema-separation-and-permissions?rq = 1),[使用SQL Server中的存儲過程管理權限](http:/ /msdn.microsoft.com/en-us/library/bb669058.aspx) – Mike

回答

1

在安全性方面,這似乎是一個good way以防止訪問基礎表。

不利的副作用是您不能通過WHERE,GROUP BY子句或類似方法篩選存儲過程生成的結果集。

但是,如果在底層視圖中定義靜態約束 或通過stored proc's input parameters定義「動態」約束,那麼這並不是那麼悲慘。

1)在下面的視圖

CREATE VIEW [B].[VIEW3] AS SELECT * FROM [B].[VIEW2], [C].[VIEW1] WHERE [X]='Something' AND [Y] = GETDATE() 
CREATE PROC [B].[PROC1] WITH EXECUTE AS OWNER AS BEGIN SELECT * FROM [B].[VIEW3] END 

2)通過輸入動態約束靜態約束參數

面對這一問題
CREATE PROC [B].[PROC1] (@X varchar(30), @Y DATETIME) WITH EXECUTE AS OWNER AS BEGIN SELECT * FROM [B].[VIEW2], [C].[VIEW1] WHERE [X][email protected] AND [Y][email protected] AND 
相關問題