程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQL問題匯編

SQL問題匯編

編輯:關於SqlServer
Server 7.0應該注意哪些問題?

對於一般帳號來說升級程序工作得非常棒。在升級到SQL Server 7.0過程中,SQL
Server 6.5中的別名被轉換成角色成員。例如,如果你的一個別名是“dbo”,
SQL Server將把你作為“db_owner”固定服務器角色中的成員。如果你有數個登錄名別名是“sales”,
SQL Server 7.0升級程序將創建一個“sales”角色,並為這些用戶創建帳號,然後把他們都放入到“sales”角色中。SQL
Server 6.5中的“sales”帳號所擁有的權限中被分配給SQL Server 7.0中的“sales”角色。升級過程中SQL
Server還清理系統權限的模式位,以消除重復的權限。

比較困難的情況是有人可能會把來自不同機器的10個數據庫恢復到單個的SQL
Server中,然後再升級。在SQL Server 6.5中,用戶帳號必須匹配master數據庫中的“syslogins”系統表和每個數據庫中的“sysusers”系統表。不幸的是,當你在SQL
Server 6.5中恢復來自其他服務器的數據庫時,它們不能夠匹配。當這種情況下數據庫被恢復後,其安全系統已經損壞,升級到SQL
Server 7.0後仍然是損壞的。

訣竅是在升級前保證你的SQL Server 6.5系統是工作良好的。升級前你還應該運行“sp_change_users_login”系統存儲過程來確保數據庫用戶和登錄名存在正確的映射關系。

使用SQL Server 7.0建立一個安全的數據庫的最好方法是什麼?

永遠不要給用戶直接訪問表的權限。如果你希望讓用戶使用交互式工具如Microsoft
Acess 2000來訪問數據庫,可以只給他們訪問視圖和存儲過程的權限,而不是對表的直接訪問權限。如果存儲過程的擁有者是“dbo”,而且存儲過程所引用的表和視圖的擁有者也都是“dbo”,給予用戶對存儲過程的執行(EXECUTE)權限就足夠了。這樣就根本不用檢查對表的訪問權限了。

你還可以使用其它安全特性,比如通過在存儲過程中加入商業邏輯來控制哪些字段或行能夠被訪問。視圖是阻止用戶直接訪問表的另一種途徑。與存儲過程的區別是,你可以為視圖授予SELECT、INSERT、UPDATE或DELETE權限,而存儲過程則只能授予EXECUTE權限。

還有一件需要注意的事情是,如果你在另外一個數據庫中執行SELECT語句,數據庫對象擁有者的的鏈式關系仍然適用。比如說,在由SQL
Server登錄名“sa”所擁有的pubs數據庫中,你就不能執行跨表查詢連接至被一個NT登錄名所擁有的數據庫中,即使兩個登錄名都是“sysadmin”角色的成員。如果你希望連接來自3個不同數據庫的表,那麼這3個數據庫的擁有者應該是同一個帳號。如果需要的話你可以使用存儲過程“sp_changedbowner”來改變數據庫的擁有者。

還有其它值得提到的新特性嗎?

我們還增加了DENY語句,可以被管理員用來禁止某個用戶對一個對象的所有訪問權限。在SQL
Server 6.5中你可以在一行上運行兩次REVOKE語句來在某種程度上仿效DENY語句。

在SQL Server 7.0中,如果你想阻止某人查看某一個表,你可以使用DENY來禁止他的SELECT權限。使用DENY語句時應當非常小心。舉個例子:假如你在AUTHORS表上有SELECT和INSERT的權限,而且作為某個NT組的成員,你還擁有UPDATE權限。然而,你所在的另一個NT組被DENY語句禁止了INSERT和UPDATE權限。結果是,你只有SELECT權限了。DENY語句會禁止對數據庫對象的訪問,因此你要確保沒有對PUBLIC組使用DENY語句,因為任何用戶都總是PUBLIC組中的成員。許多沒有經驗的管理員這樣做了,然後他們只好打電話來向我們求助。

DENY不僅可以用於數據庫對象,它還可以用於登錄名。例如,你授予了NT組“domain
users”登錄到SQL Server的權限。Joe剛剛被解雇了但是他還不知道。你不能簡單地使用REVOKE語句來取消Joe的登錄權限,因為他沒有被單獨授予登錄權限,而是和其他成員一起作為“domain
users”組中的一個成員被一起授予登錄權限。這時你就可以特別地對Joe使用DENY語句。這樣他不能登錄到SQL
Server了,而同一個組的其他成員仍然可以。

應用程序角色是如何工作的?

可能解釋應用程序角色的最好方式是在實際情況中說明。比方說你想做一個職工工資單的應用程序,可以允許用戶更新工資。當然你不希望允許用戶簡單地登錄到SQL
Server中然後更改工資。如果雇員能夠那樣做的話,他就可能試圖去更改他自己的工資了。更合適的方法是使用一個工資單應用程序,它能夠執行特定的安全檢查,例如,不允許用戶更新他們自己的工資。

它是這樣工作的。你的工資單應用程序以使用者的安全級別登錄到SQL
Server,以便服務器審計追蹤工具能夠知道到底是誰在登錄到SQL Server。然後你的應用程序切換到適當的數據庫並調用系統存儲過程“sp_setapprole”來啟動應用程序角色。應用程序角色是受密碼保護的,所以你需要把密碼作為參數傳遞給sp_setapprole。當數據在網上傳輸時,你也可以對密碼進行加密。

一旦啟動了應用程序角色,用戶現有的權限被關閉,應用程序角色的安全權限被相應打開。你的應用程序現在就可以使用應用程序角色來執行修改數據庫的操作了。

需要注意的一個問題是,應用程序角色是特定於連接的。假如你同時打開了兩個到SQL
Server的連接,你必須保證每個連接的應用程序角色都被打開了。使用應用程序角色時,一旦打開連接並轉換到適當的數據庫後,第一件事情就是調用“sp_setapprole”存儲過程。如果不啟動應用程序角色,你就不能夠訪問任何應用程序角色所專有的數據。

在SQL Server 7.0中,角色是一個新概念。使用數據庫角色有什麼意義呢?

我們新增了7個固定的服務器角色和9個固定的數據庫角色。服務器角色是分散系統管理員工作的一個辦法。在SQL
Server 6.5和更早的版本中,有一個叫做“sa”的帳號,這個帳號可以在數據庫服務器上做任何事情。在那時,你可以有10個Windows
NT用戶被映射成“sa”,這意味著這10個用戶都可以在任何時間做任何事情,然而服務器審計工具只會記錄成“sa”的操作。你沒有任何辦法來確認到底是誰做了什麼操作。

SQL Server 7.0改進了這一點。不是像以前那樣使“sa”具有所有的特權,權限是通過角色成員來獲得的。我們還把系統管理員的特權劃分成了多個角色。例如,為了在SQL
Server 7.0中讓某人獲得系統管理員權限,你只需要把他加入到“sysadmin”這個固定服務器角色中即可。

還有其它角色,例如“dbcreator”是用來創建和更改數據庫的;“securityadmin”是用來增加新的登錄或者重置缺省數據庫的。“sa”登錄仍然存在,是為了保持向後兼容性。但該權限是通過成為“sysadmin”角色中的成員來獲得的。服務器的審計追蹤功能將根據你的Windows
NT或者SQL Server登錄名來跟蹤所做的改變,而不管分配給該帳號的安全特權。

在單個數據庫這一級別上情況也非常相似。在以前版本中,人們會把自己化名為“dbo”來獲得對數據庫的所有權限。現在用戶可以被分配成“db_owner”角色,同樣可以擁有對單個數據庫的完全控制權限。而且,還有更具體的角色,比如“db_acessadmin”用來控制對數據庫的訪問,“db_securityadmin”用來給予其他用戶訪問權限,“db_backupOperator”用於備份數據。我們還增加了用戶自定義的和應用程序角色,而且允許用戶可以同時成為多個數據庫角色的成員。

與Windows NT集成是使SQL Server 7.0安全性更易於實施還是使它更為強健呢?

兩者都是。你應該使用7.0版的集成安全的原因之一就是,6.5及更早版本的標准安全模式沒有提供一些最基本的功能。

關於安全方面的一個基本原則就是口令應該在一定的時間後過期。SQL
Server標准安全模式沒有這個功能。另外,它也不禁止為空的口令,不要求口令必須長於一定數目的字符,也不提供任何其它高級口令管理功能。我們希望能夠利用Windows
NT,它已經包括所有這些功能。現在,當你鎖定使用Windows NT的口令政策時,你通過集成安全同時也鎖定了SQL
Server。從這個角度來說,它確實增強了安全性。

從使用的角度來說,增加整個域的用戶到SQL Server中去要比以前容易的多,而且該過程是動態的。在SQL


您正在看的SQLserver教程是:SQL問題匯編。
Server 6.5中,如果你使用SQL Server的安全管理器來增加一組用戶,它將列舉在那個組中的所有用戶。假如該NT組中有人被新增或者被刪除,你必須重新執行以上的操作。而現在呢,舉個例子:假如你把“domain
user”組加入作為一個SQL Server登錄,而“domain user”這個NT組中有用戶被刪除,你不需要在SQL
Server中做任何改動來防止該用戶獲得對SQL Server的訪問權限。

你認為SQL Server 7.0與以前的版本相比,安全模式中最重要的改變是什麼?

應該是它與Windows NT的完全集成。在SQL Server 6.5及更早的版本中,與Windows
NT的安全集成是不是直接處理的。

在SQL Server 6.5中由兩個選擇。你要麼是系統管理員,要麼是普通用戶。如果你對SQL
Server的主注冊表項有完全的控制權限,那麼你是以“sa”登錄的,即系統管理員。對於某些IT機構來說,這樣做就下放了太多的控制權限。

在另一方面,如果你對主注冊表項只有只讀權限,SQL
Server把你作為一個映射登錄來處理,即在你的Windows NT登錄名和SQL
Server登錄名之間的映射。

從實際操作上來說,你不需要登錄兩次,即登錄到Windows NT後再登錄到SQL
Server。但事實上在SQL Server 6.5中你仍然在使用標准安全模式登錄,而沒有使用Windows
NT安全模式。當你使用Windows NT組用戶身份登錄時,在該NT組的所有人都被映射到相同的SQL
Server 7.0登錄。否則的話該組的每個用戶都需要單獨的登錄。這導致了大量額外的數據庫管理任務。

在SQL Server 7.0中我們最重要的目標就是與Windows NT安全性完全集成。我們把所有的安全特性都集成到SQL
Server自身。當你登錄到SQL Server,數據庫管理系統將檢查你的實際Windows
NT訪問標識,把你的主安全標識號(SID)和相關的從安全表識號列表映射到SQL
Server 7.0 Master數據庫的sysxlogins表中的登錄名。總的說來就是SQL Server
7.0直接使用Windows NT的安全機制,去掉了以前附加的映射層。這意味著大量減少了用於安全管理的時間、減少了出錯的可能而且它確實可以很好地工作。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved