應用程序訪問數據庫進行增刪改查,一般我們都是創建登錄名、映射到SQL Server的數據庫、再對數據庫的用戶進行賦予適當的權限來實現的。但是如果我們不希望SQL Server的登錄賬號不能直接訪問相應的數據而又能返回用戶需要的數據,那麼應用程序角色可以幫助我們實現這樣的需求。
【正文】
Microsoft SQL Server 安全體系的最終實現在數據庫本身上實現。無論使用什麼應用程序與 SQL Server 通訊,這都是控制用戶活動的最佳方法。但是,有時必須自定義安全控制以適應個別應用程序的特殊需要,尤其是當處理復雜數據庫和含有大表的數據庫時。
在SQL Server中,我們使用登錄賬號來進入SQL Server,而該賬號在服務器級別所擁有的權限由它加入服務器角色來決定。當然也可以單獨賦予登錄賬號對於服務器對象的權限。
至於登錄賬號在數據庫中擁有的權限,由該登錄賬號映射到數據庫的數據庫用戶加入的數據庫角色來決定。當然也可以單獨賦予數據庫用戶對於數據庫對象的權限。
我們可以用一幅圖來說明登錄賬號、服務器角色、數據庫角色、數據庫用戶以及權限之間的關系。
從前面的介紹可以看到SQL Server的權限體系已經是比較完善的,那麼在權限體系中加入應用程序角色有什麼作用呢,應用程序角色究竟是什麼呢?
應用程序角色也是數據庫主體,應用程序角色跟數據庫角色是並排的,應用程序角色和數據庫角色一樣也是定義在每個數據庫下面。
跟數據庫角色一樣,應用程序角色可以擁有數據庫對象的權限。
可以使用CREATE APPLICATION ROLE語句創建應用程序角色,例如:
USE NorthwindCS
go
CREATE APPLICATION ROLE AppRole_AccessProductTable
WITH PASSWORD = 'password',
DEFAULT_SCHEMA = dbo
這樣我們就創建一個名為AppRole_AccessProductTable 、密碼為'password'、默認架構為dbo的應用程序角色。
首先我們以用戶DBO來訪問數據庫NorthwindCS
接著,我們激活應用程序角色AppRole_AccessProductTable,並且查詢當前的用戶,可以發現當前的用戶變為AppRole_AccessProductTable,也就是說當前是以應用程程序角色AppRole_AccessProductTable的權限來訪問數據。
在SQL的早期版本中,用戶若要在激活應用程序角色後重新獲取其原始安全上下文,唯一的方法就是斷開SQLSERVER連接,然後重新連接。
在SQL2005中,sp_setapprole提供了Cookie選項,他可以在激活應用程序之前創建一個包含上下文信息的Cookie。sp_unsetapprole可以使用此Cookie將會話恢復到其原始上下文。語句如下面所述:
EXEC sp_unsetapprole @cookie = NULL -- varbinary(50)
如果這樣的話,那麼激活應用程序角色的語句也得改為
EXEC sp_setapprole @rolename = 'AppRole_AccessProductTable', -- sysname
@password = 'password', -- sysname
@encrypt = '', -- varchar(10)
@fCreateCookie = true, -- bit
@cookie = @cookie OUTPUT -- varbinary(50)
應用程序角色的權限與自定義數據庫角色的權限賦予方法一樣,可以將特定對象的權限賦予角色。例如賦予應用程序角色對於數據庫NorthwindCS的產品表有查詢、更新、插入的權限:
use [NorthwindCS]
GO
GRANT INSERT ON [dbo].[產品] TO [AppRole_AccessProductTable]
GO
use [NorthwindCS]
GO
GRANT SELECT ON [dbo].[產品] TO [AppRole_AccessProductTable]
GO
use [NorthwindCS]
GO
GRANT UPDATE ON [dbo].[產品] TO [AppRole_AccessProductTable]
GO
應用程序角色是一個數據庫主體,它使應用程序能夠用其自身的、類似用戶的權限來運行。在使用應用程序時,可以僅僅允許那些經過特定應用程序連接的用戶來訪問數據庫中的特定數據,如果不通過這些特定的應用程序連接,那麼無法訪問這些數據。這是使用應用程序角色實現安全管理的目的,這也是對於數據庫角色的有效補充,可以更自由地控制訪問數據庫的權限。