當在服務器上運行SQL Server 時,我們總是要想方設法去使SQL Server 免遭非法用戶的侵入,拒絕其訪問數據庫,保證數據的安全性。SQL Server 提供了強大的內置的安全性和數據保護,來幫助實現這種理所當然的要求。從前面的介紹中我們可以看出SQL Server 提供了從操作系統,SQL ServerE, 數據庫到對象的多級別的安全保護。其中也涉及到角色、數據庫用戶、權限等多個與安全性有關的概念。現在我們面臨的問題就是如何在SQL Server 內把這些不同的與安全性有關的組件結合起來,充分地利用各種組件的優點,考慮到其可能存在的缺點來揚長避短,制定可靠的安全策略。使SQL Server 更健壯,更為“不可侵犯”。
下面我們將介紹幾種安全性管理策略,您應該做的就是看懂並理解這些策略方法,然後將它們簡單地結合到一起就可以了。
1 使用視圖作為安全機制
在游標和視圖一章我們已經提到視圖可以做為一種安全機制的主要原因在於視圖是一張虛表,而且它是由查詢語句來定義的,是一個數據結果集,通過視圖,用戶僅能查詢修改他所能看到的數據,其它的數據庫或表對於該用戶既不可見也無法訪問。通過視圖的權限設置,用戶只具有相應的訪問視圖的權限,但並不具有訪問視圖所引用的基本表的相應權限。
通過使用不同的視圖並對用戶授予不同的權限,不同的用戶可以看到不同的結果集,可以實現行級或列級的數據安全性。下面的幾個例子說明了視圖是如何實現數據安全性。
2 使用了行級、列級別安全性的視圖
例14-18: 在該例中某一銷售點只能查看它自己的銷售信息。我們使用pubs 數據庫中的sales 表。
首先創建視圖
3 視圖與權限結合
如果將訪問視圖的權限授予給用戶,這樣即使該用戶不具有訪問視圖所引用的基本表的權限,但其仍可以從中查看相應的數據信息。
視圖與權限相結合究竟能帶來什麼好處呢?下面我們舉一個例子來進行說明。首先假設用戶A 對sales 表的payterms 列沒有SELECT 權限,對其它列有且僅有SELECT 權限,如果要查看其它銷售信息不能使用這樣的語句:
select * from sales
而必須指出其余列的列名。這就要求用戶了解表的結構,通常來說讓用戶了解表結構是一件很不聰明的事,那麼如何解決這一問題呢?
很簡單如果創建一個視圖view1, 該視圖包含除payterms 列外的所有列,並且將 SELECT 權限授予用戶A, 這樣用戶A 就可以執行語句:select * from view1, 從而查看到銷售信息。
4 使用存儲過程作為安全機制
如果用戶不具有訪問視圖和表的權限,那麼通過存儲過程仍能夠讓其查詢相應的數據信息,實現的方法很簡單,只要讓該用戶具有存儲過程的EXEC 權限就可以了。當然要確保該存儲過程中包含了查詢語句。比如可創建下面的存儲過程:
create procedure selsales as
select * from sales
然後將存儲過程的EXEC 權限授予用戶,當用戶執行該存儲過程時就可以查看到相應信息。
使用存儲過程的優點在於不必對視圖和表的訪問權限進行分配。
小結
本文主要討論了SQL Server 的安全性管理問題。涉及到數據庫用戶、角色、權限等作為一名系統管理員或安全管理員,在進行安全屬性配置前,首先要確定應使用哪種身份認證模式。要注意恰當地使用guest 用戶和public 角色,並深刻了解應用角色對於實現數據查詢和處理的可控性所展示出的優點。