開發(fā)人員從SQL Server 6.5升級到SQL Server 7.0應(yīng)該注意哪些問題? 對于一般帳號來說升級程序工作得非常棒。在升級到SQL Server 7.0過程中,SQL Server 6.5中的別名被轉(zhuǎn)換成角色成員。例如,如果你的一個別名是“dbo”, SQL Server將把你作為“db_owner”固定服務(wù)器角色中的成員。如果你有數(shù)個登錄名別名是“sales”, SQL Server 7.0升級程序?qū)?chuàng)建一個“sales”角色,并為這些用戶創(chuàng)建帳號,然后把他們都放入到“sales”角色中。SQL Server 6.5中的“sales”帳號所擁有的權(quán)限中被分配給SQL Server 7.0中的“sales”角色。升級過程中SQL Server還清理系統(tǒng)權(quán)限的模式位,以消除重復(fù)的權(quán)限。
比較困難的情況是有人可能會把來自不同機器的10個數(shù)據(jù)庫恢復(fù)到單個的SQL Server中,然后再升級。在SQL Server 6.5中,用戶帳號必須匹配master數(shù)據(jù)庫中的“syslogins”系統(tǒng)表和每個數(shù)據(jù)庫中的“sysusers”系統(tǒng)表。不幸的是,當(dāng)你在SQL Server 6.5中恢復(fù)來自其他服務(wù)器的數(shù)據(jù)庫時,它們不能夠匹配。當(dāng)這種情況下數(shù)據(jù)庫被恢復(fù)后,其安全系統(tǒng)已經(jīng)損壞,升級到SQL Server 7.0后仍然是損壞的。
訣竅是在升級前保證你的SQL Server 6.5系統(tǒng)是工作良好的。升級前你還應(yīng)該運行“sp_change_users_login”系統(tǒng)存儲過程來確保數(shù)據(jù)庫用戶和登錄名存在正確的映射關(guān)系。
使用SQL Server 7.0建立一個安全的數(shù)據(jù)庫的方法是什么? 永遠(yuǎn)不要給用戶直接訪問表的權(quán)限。如果你希望讓用戶使用交互式工具如Microsoft Acess 2000來訪問數(shù)據(jù)庫,可以只給他們訪問視圖和存儲過程的權(quán)限,而不是對表的直接訪問權(quán)限。如果存儲過程的擁有者是“dbo”,而且存儲過程所引用的表和視圖的擁有者也都是“dbo”,給予用戶對存儲過程的執(zhí)行(EXECUTE)權(quán)限就足夠了。這樣就根本不用檢查對表的訪問權(quán)限了。
你還可以使用其它安全特性,比如通過在存儲過程中加入商業(yè)邏輯來控制哪些字段或行能夠被訪問。視圖是阻止用戶直接訪問表的另一種途徑。與存儲過程的區(qū)別是,你可以為視圖授予SELECT、INSERT、UPDATE或DELETE權(quán)限,而存儲過程則只能授予EXECUTE權(quán)限。
還有一件需要注意的事情是,如果你在另外一個數(shù)據(jù)庫中執(zhí)行SELECT語句,數(shù)據(jù)庫對象擁有者的的鏈?zhǔn)疥P(guān)系仍然適用。比如說,在由SQL Server登錄名“sa”所擁有的pubs數(shù)據(jù)庫中,你就不能執(zhí)行跨表查詢連接至被一個NT登錄名所擁有的數(shù)據(jù)庫中,即使兩個登錄名都是“sysadmin”角色的成員。如果你希望連接來自3個不同數(shù)據(jù)庫的表,那么這3個數(shù)據(jù)庫的擁有者應(yīng)該是同一個帳號。如果需要的話你可以使用存儲過程“sp_changedbowner”來改變數(shù)據(jù)庫的擁有者。
還有其它值得提到的新特性嗎?
我們還增加了DENY語句,可以被管理員用來禁止某個用戶對一個對象的所有訪問權(quán)限。在SQL Server 6.5中你可以在一行上運行兩次REVOKE語句來在某種程度上仿效DENY語句。
在SQL Server 7.0中,如果你想阻止某人查看某一個表,你可以使用DENY來禁止他的SELECT權(quán)限。使用DENY語句時應(yīng)當(dāng)非常小心。舉個例子:假如你在AUTHORS表上有SELECT和INSERT的權(quán)限,而且作為某個NT組的成員,你還擁有UPDATE權(quán)限。然而,你所在的另一個NT組被DENY語句禁止了INSERT和UPDATE權(quán)限。結(jié)果是,你只有SELECT權(quán)限了。DENY語句會禁止對數(shù)據(jù)庫對象的訪問,因此你要確保沒有對PUBLIC組使用DENY語句,因為任何用戶都總是PUBLIC組中的成員。許多沒有經(jīng)驗的管理員這樣做了,然后他們只好打電話來向我們求助。
DENY不僅可以用于數(shù)據(jù)庫對象,它還可以用于登錄名。例如,你授予了NT組“domain users”登錄到SQL Server的權(quán)限。Joe剛剛被解雇了但是他還不知道。你不能簡單地使用REVOKE語句來取消Joe的登錄權(quán)限,因為他沒有被單獨授予登錄權(quán)限,而是和其他成員一起作為“domain users”組中的一個成員被一起授予登錄權(quán)限。這時你就可以特別地對Joe使用DENY語句。這樣他不能登錄到SQL Server了,而同一個組的其他成員仍然可以。
應(yīng)用程序角色是如何工作的?
可能解釋應(yīng)用程序角色的方式是在實際情況中說明。比方說你想做一個職工工資單的應(yīng)用程序,可以允許用戶更新工資。當(dāng)然你不希望允許用戶簡單地登錄到SQL Server中然后更改工資。如果雇員能夠那樣做的話,他就可能試圖去更改他自己的工資了。更合適的方法是使用一個工資單應(yīng)用程序,它能夠執(zhí)行特定的安全檢查,例如,不允許用戶更新他們自己的工資。
它是這樣工作的。你的工資單應(yīng)用程序以使用者的安全級別登錄到SQL Server,以便服務(wù)器審計追蹤工具能夠知道到底是誰在登錄到SQL Server。然后你的應(yīng)用程序切換到適當(dāng)?shù)臄?shù)據(jù)庫并調(diào)用系統(tǒng)存儲過程“sp_setapprole”來啟動應(yīng)用程序角色。應(yīng)用程序角色是受密碼保護的,所以你需要把密碼作為參數(shù)傳遞給sp_setapprole。當(dāng)數(shù)據(jù)在網(wǎng)上傳輸時,你也可以對密碼進行加密。
一旦啟動了應(yīng)用程序角色,用戶現(xiàn)有的權(quán)限被關(guān)閉,應(yīng)用程序角色的安全權(quán)限被相應(yīng)打開。你的應(yīng)用程序現(xiàn)在就可以使用應(yīng)用程序角色來執(zhí)行修改數(shù)據(jù)庫的操作了。
需要注意的一個問題是,應(yīng)用程序角色是特定于連接的。假如你同時打開了兩個到SQL Server的連接,你必須保證每個連接的應(yīng)用程序角色都被打開了。使用應(yīng)用程序角色時,一旦打開連接并轉(zhuǎn)換到適當(dāng)?shù)臄?shù)據(jù)庫后,第一件事情就是調(diào)用“sp_setapprole”存儲過程。如果不啟動應(yīng)用程序角色,你就不能夠訪問任何應(yīng)用程序角色所專有的數(shù)據(jù)。
比較困難的情況是有人可能會把來自不同機器的10個數(shù)據(jù)庫恢復(fù)到單個的SQL Server中,然后再升級。在SQL Server 6.5中,用戶帳號必須匹配master數(shù)據(jù)庫中的“syslogins”系統(tǒng)表和每個數(shù)據(jù)庫中的“sysusers”系統(tǒng)表。不幸的是,當(dāng)你在SQL Server 6.5中恢復(fù)來自其他服務(wù)器的數(shù)據(jù)庫時,它們不能夠匹配。當(dāng)這種情況下數(shù)據(jù)庫被恢復(fù)后,其安全系統(tǒng)已經(jīng)損壞,升級到SQL Server 7.0后仍然是損壞的。
訣竅是在升級前保證你的SQL Server 6.5系統(tǒng)是工作良好的。升級前你還應(yīng)該運行“sp_change_users_login”系統(tǒng)存儲過程來確保數(shù)據(jù)庫用戶和登錄名存在正確的映射關(guān)系。
使用SQL Server 7.0建立一個安全的數(shù)據(jù)庫的方法是什么? 永遠(yuǎn)不要給用戶直接訪問表的權(quán)限。如果你希望讓用戶使用交互式工具如Microsoft Acess 2000來訪問數(shù)據(jù)庫,可以只給他們訪問視圖和存儲過程的權(quán)限,而不是對表的直接訪問權(quán)限。如果存儲過程的擁有者是“dbo”,而且存儲過程所引用的表和視圖的擁有者也都是“dbo”,給予用戶對存儲過程的執(zhí)行(EXECUTE)權(quán)限就足夠了。這樣就根本不用檢查對表的訪問權(quán)限了。
你還可以使用其它安全特性,比如通過在存儲過程中加入商業(yè)邏輯來控制哪些字段或行能夠被訪問。視圖是阻止用戶直接訪問表的另一種途徑。與存儲過程的區(qū)別是,你可以為視圖授予SELECT、INSERT、UPDATE或DELETE權(quán)限,而存儲過程則只能授予EXECUTE權(quán)限。
還有一件需要注意的事情是,如果你在另外一個數(shù)據(jù)庫中執(zhí)行SELECT語句,數(shù)據(jù)庫對象擁有者的的鏈?zhǔn)疥P(guān)系仍然適用。比如說,在由SQL Server登錄名“sa”所擁有的pubs數(shù)據(jù)庫中,你就不能執(zhí)行跨表查詢連接至被一個NT登錄名所擁有的數(shù)據(jù)庫中,即使兩個登錄名都是“sysadmin”角色的成員。如果你希望連接來自3個不同數(shù)據(jù)庫的表,那么這3個數(shù)據(jù)庫的擁有者應(yīng)該是同一個帳號。如果需要的話你可以使用存儲過程“sp_changedbowner”來改變數(shù)據(jù)庫的擁有者。
還有其它值得提到的新特性嗎?
我們還增加了DENY語句,可以被管理員用來禁止某個用戶對一個對象的所有訪問權(quán)限。在SQL Server 6.5中你可以在一行上運行兩次REVOKE語句來在某種程度上仿效DENY語句。
在SQL Server 7.0中,如果你想阻止某人查看某一個表,你可以使用DENY來禁止他的SELECT權(quán)限。使用DENY語句時應(yīng)當(dāng)非常小心。舉個例子:假如你在AUTHORS表上有SELECT和INSERT的權(quán)限,而且作為某個NT組的成員,你還擁有UPDATE權(quán)限。然而,你所在的另一個NT組被DENY語句禁止了INSERT和UPDATE權(quán)限。結(jié)果是,你只有SELECT權(quán)限了。DENY語句會禁止對數(shù)據(jù)庫對象的訪問,因此你要確保沒有對PUBLIC組使用DENY語句,因為任何用戶都總是PUBLIC組中的成員。許多沒有經(jīng)驗的管理員這樣做了,然后他們只好打電話來向我們求助。
DENY不僅可以用于數(shù)據(jù)庫對象,它還可以用于登錄名。例如,你授予了NT組“domain users”登錄到SQL Server的權(quán)限。Joe剛剛被解雇了但是他還不知道。你不能簡單地使用REVOKE語句來取消Joe的登錄權(quán)限,因為他沒有被單獨授予登錄權(quán)限,而是和其他成員一起作為“domain users”組中的一個成員被一起授予登錄權(quán)限。這時你就可以特別地對Joe使用DENY語句。這樣他不能登錄到SQL Server了,而同一個組的其他成員仍然可以。
應(yīng)用程序角色是如何工作的?
可能解釋應(yīng)用程序角色的方式是在實際情況中說明。比方說你想做一個職工工資單的應(yīng)用程序,可以允許用戶更新工資。當(dāng)然你不希望允許用戶簡單地登錄到SQL Server中然后更改工資。如果雇員能夠那樣做的話,他就可能試圖去更改他自己的工資了。更合適的方法是使用一個工資單應(yīng)用程序,它能夠執(zhí)行特定的安全檢查,例如,不允許用戶更新他們自己的工資。
它是這樣工作的。你的工資單應(yīng)用程序以使用者的安全級別登錄到SQL Server,以便服務(wù)器審計追蹤工具能夠知道到底是誰在登錄到SQL Server。然后你的應(yīng)用程序切換到適當(dāng)?shù)臄?shù)據(jù)庫并調(diào)用系統(tǒng)存儲過程“sp_setapprole”來啟動應(yīng)用程序角色。應(yīng)用程序角色是受密碼保護的,所以你需要把密碼作為參數(shù)傳遞給sp_setapprole。當(dāng)數(shù)據(jù)在網(wǎng)上傳輸時,你也可以對密碼進行加密。
一旦啟動了應(yīng)用程序角色,用戶現(xiàn)有的權(quán)限被關(guān)閉,應(yīng)用程序角色的安全權(quán)限被相應(yīng)打開。你的應(yīng)用程序現(xiàn)在就可以使用應(yīng)用程序角色來執(zhí)行修改數(shù)據(jù)庫的操作了。
需要注意的一個問題是,應(yīng)用程序角色是特定于連接的。假如你同時打開了兩個到SQL Server的連接,你必須保證每個連接的應(yīng)用程序角色都被打開了。使用應(yīng)用程序角色時,一旦打開連接并轉(zhuǎn)換到適當(dāng)?shù)臄?shù)據(jù)庫后,第一件事情就是調(diào)用“sp_setapprole”存儲過程。如果不啟動應(yīng)用程序角色,你就不能夠訪問任何應(yīng)用程序角色所專有的數(shù)據(jù)。