34

34. 使用者與安全性管理

建立與管理使用者登入帳戶

管理資料庫存取權限

管理資料庫角色

安全性帳戶授權

本章總結

本章將學習在 Microsoft SQL Server 2000 環境下管理使用者並確保安全性。安全性管理和備份、回復計劃、容量規模及空間管理一樣，都是 DBA 例行的工作。少了系統的安全性，資料就會遺失或被破壞。

本章涵蓋了使用者和安全性管理有關的主題。我們會學習建立與管理使用者登入帳戶，以及不同的驗證模式；另外還將學習 SQL Server 使用者 ID。 使用者登入帳戶 （user login）是用來驗證使用者是否允許存取該 SQL Server，可透過 Microsoft Windows NT、Microsoft Windows 2000 或 SQL Server 來驗證。 使用者ID （user ID）分配使用者權限，用來在個別資料庫中存取特定物件。使用者 ID 與使用者登入帳戶相關，不過兩者可以設定一樣的名稱，也可以設定不一樣的名稱，這些稍後將在本章討論。本章學習在 SQL Serve r中分配的不同類型權限，以及如何使用權限。另外也會學習利用角色簡化使用者的管理工作。最後會學到的是 SQL Server 2000 安全帳戶授權。在看完本章後，您應具備管理使用者登入帳戶和安全性的常識。

建立與管理使用者登入帳戶

現在先透過使用者登入帳戶，開始管理使用者與安全性的第一步。本節會介紹登入帳戶的重要性，以及用於維持登入帳戶的驗證模式。接著我們會介紹三種建立登入的方法：使用 SQL Server Enterprise Manager、使用 Transact-SQL（T-SQL），以及使用 建立登入精靈 。最後回學習利用 Enterprise Manager 和T-SQL建立新的使用者帳戶。

建立使用者登入帳戶的原因

使用者登入帳戶可達到保護資料的目的，避免資料庫被未驗證過的使用者有意或無意的更改。利用使用者登入帳戶可識別 SQL Server 中的每一個授權使用者。每個使用者登入帳戶都擁有一組唯一的名稱和密碼。如果沒有使用者登入帳戶，所有對 SQL Server 的連接將使用同一個識別符號，這樣就無法根據不同層級的使用者設立不同層級的安全存取範圍。

使用者登入帳戶可設定不同層級的安全存取，也就是用不同的登入帳戶就有不同存取物件和執行功能的權限。我們可對某些資料庫物件加密，例如將預存程序和檢視對未驗證使用者隱藏定義。使用者登入帳戶可以允許特定層級的使用者插入或更新新資訊至資料庫資料表，而一般層級的使用者只能用唯讀方式存取資料表。

讓我們回到

第 18 章 的範例，了解登入帳戶如何限制資料的存取。範例中利用檢視表限制對特定資料的存取。假定一個 Employee 資料表中包含職員姓名、電話號碼、辦公室號碼、等級、工資、獎金等資訊，為避免使用者存取資料表中的機密資料，要先建立檢視表，只包含如職員姓名、電話號碼及辦公室號碼等較不機密的資訊，透過使用者登入帳戶限制存取基底資料表的資料，僅允許檢視表資料的存取。當然，如果沒有利用使用者登入帳戶做控管，而允許任何使用者存取檢視表或資料表，就失去了使用檢視表的意義。

驗證模式

驗證模式有兩種：Microsoft Windows 驗證和混合模式驗證。在 Windows 驗證模式中，作業系統會負責驗證使用者，在 SQL Server 中利用作業系統的驗證決定使用者的權限。在混合模式驗證中，Windows NT/2000 和 SQL Server 同時負責驗證使用者。在存取 SQL Server 之前，必須先登入 Windows NT/2000 帳戶。因此選擇驗證模式前，必須決定是否要使用雙重的驗證。讓我們更詳細的了解這兩種驗證模式，然後學習執行這些模式。

Windows 驗證

在 Windows 驗證中，SQL Server 透過 Microsoft Windows NT/2000 來提供登入的安全性。當使用者登入 Windows NT/2000，同時確認了使用者帳戶身份。然後 SQL Server 將驗證使用者是否為 Windows NT/2000 確認的使用者，然後依驗證身分給與資料庫存取的權限。SQL Server 的登入程序結合了 Windows 的安全登入程序，透過 Windows NT/2000 提供的複雜加密過程，建置了網路安全性屬性。由於 SQL Server 和 Windows 的登入安全性驗證是結合在一起的，所以這種方式不再需要別的驗證方法。用來登入的唯一密碼就是 Windows NT/2000 的密碼。

Windows 驗證是比混合驗證模式更好的安全性方法，因為它提供了附加的安全性特性，包括安全確認、加密密碼、稽核、密碼到期時間、最小密碼長度，以及在特定次數的失敗登入後自動鎖定帳戶。

混合模式驗證

在混合模式驗證中，使用者可以用 Windows 驗證或 SQL Server 驗證來存取SQL Server。當有一個來自非安全系統的連接時，SQL Server 會驗證這個登入，檢驗是否設定過這個 SQL Server 登入帳戶。這個帳戶驗證在 SQL Server 中執行，根據儲存在資料庫中的使用者名稱和密碼進行檢驗。在嘗試連接 SQL Server 時，系統會提示使用者提供使用者名稱和密碼。如果沒有提供這些資訊，SQL Server 系統會拒絕該使用者的存取。

在您執行 Windows 95/98 時無法使用 Windows 驗證模式，因此在這些平臺上您必須使用 SQL Server 驗證（用混合模式驗證）。此外，Web 應用程式需要 SQL Server 驗證（透過 Internet Information Server，或稱為 IIS），因為這些應用程式的使用者並不一定都在同一個網域中，因此就不能依靠 Windows 安全性，這時就需要使用 SQL Server 安全性。其他需要存取資料庫的應用程式也同樣需要 SQL Server 驗證：一些應用程式的開發人員會因為它們的應用程式結構簡單而喜歡使用 SQL Server 安全裝置。在使用 SQL Server 安全裝置時（在信任網路中），應用程式的開發人員不再需要提供應用程式自身的安全性驗證，這樣可以簡化他們的工作。

設定驗證模式

請依下列步驟，用 Enterprise Manager 設定驗證模式：

1. 開啟 Enterprise Manager 視窗，在左邊窗格中的伺服器名稱上按一下滑鼠右鈕，並從快顯功能表中選擇 內容 ，進入 SQL Server 屬性視窗。按一下 安全性 頁籤，如圖34-1所示。

   圖34-1　「SQL Server屬性」視窗的「安全性」頁籤

- 在這個頁籤中，選擇安全性方法和啟動服務帳戶。在 安全性 區域中，指定是否使用 Windows NT/2000 和 SQL Server（混合模式）驗證，或只使用 Windows NT/2000 驗證。這裡可以指定登入稽核層級。登入稽核層級指定保留哪些登入時的記錄。應該根據安全性需要選擇稽核等級，有四個等級可使用：
  - 無 預設選項；不執行登入稽核。
  - 成功 記錄所有成功的登入嘗試。
  - 失敗 記錄所有失敗的登入嘗試。
  - 全部 記錄所有的登入嘗試。

說明

稽核層級是一個資料庫屬性，同樣的，這個設定將套用到所有的登入上。

- 在 啟動服務帳戶 區域中，指定在啟動 SQL Server 服務時使用的 Windows NT 帳戶。可使用內建的本機系統帳戶，或指定一個帳戶後提供密碼。按 確定 接受設定。

登入帳戶和使用者

接下來的幾個章節中將學習建立登入帳戶和使用者。在開始之前，需要先瞭解何謂登入帳戶和使用者。這裡僅將這兩個字詞簡要的定義。

我們可以看到，要連到資料庫中，可能會需要 Windows NT/2000 使用者帳戶，或許同時也許需要使用 SQL Server 驗證。不論使用的是 Windows NT/2000 驗證或混合模式驗證，連接到 SQL Server 的帳戶都被稱為「登入」帳戶。除了 SQL Server 登入帳戶，每個資料庫會分配一組指定的使用者，這些使用者是虛擬帳戶。這些虛擬帳戶提供 SQL Server 登入帳戶一個別名。例如在 Northwind 資料庫中，也許有使用者的名稱為 manager ，而這個使用者名稱和 SQL Server 登入帳戶 guest 有關；在 pubs 資料庫中，可能有使用者名稱也是 manager ，而這個使用者名稱卻與 SQL Server 登入帳戶 sa 有關。在預設情況下，SQL Server 登入帳戶和資料庫使用者 ID 設定沒有相關，因此並沒有任何權限。

建立 SQL Server 登入帳戶

大部分的管理任務可以使用多種方法執行，而建立使用者登入帳戶也不例外。您能透過三種途徑的任何一種來建立登入：使用 Enterprise Manager、使用 T-SQL 或使用 Create SQL Server Login Wizard。在本節中，您將學到如何使用這三種方法建立 SQL Server 登入帳戶。

利用 Enterprise Manager 建立 SQL Server 登入帳戶

要利用 Enterprise Manager 建立 SQL Server 登入帳戶，請按照下列步驟操作：

1. 在 Enterprise Manager 視窗的左邊窗格中，展開伺服器群組、伺服器，然後展開 安全性 資料夾。在 登入 上按一下滑鼠右鈕，然後在快顯功能表中選擇 新增登入 ，進入 SQL Server 登入屬性視窗，如圖34-2所示。在 一般 頁籤的 名稱 文字方塊中鍵入SQL Server登入帳戶。如果使用的是Windows驗證，那麼這個名稱必須是有效的Windows NT或Windows 2000帳戶名稱。接下來在 網域 文字方塊中指定 Windows NT 或 Windows 2000 的網域。在預設區域指定使用者使用的預設資料庫和語言。在 驗證 區域中，指定是否使用 Windows NT 或 Windows 2000 帳戶，或者使用 SQL Server 驗證。如果選擇 SQL Server 驗證，則使用混合模式驗證。

   圖34-2　「SQL Server 登入屬性」視窗的「一般」頁籤

- 按一下 伺服器角色 頁籤，如圖34-3所示。在這個頁籤中可以指定新的登入選取的伺服器角色，在可使用的角色清單中選擇。按一下 屬性 允許檢視和修改所選取的角色。（有關角色的討論將在本章的 ＜管理資料庫角色＞ 一節中進行。）

圖34-3　「SQL Server 登入屬性」視窗的「伺服器角色」頁籤

- 選取 資料庫存取 頁籤，如圖34-4所示。這個頁籤可指定權限使用者可以存取的資料庫。（資料庫權限將在 ＜管理資料庫存取權限＞ 一節中說明。）您可選擇多個資料庫以及對於這些資料庫可用的角色。按 屬性 就能檢視和管理資料庫角色屬性。

圖34-4　「SQL Server 登入屬性」視窗的「資料庫存取」頁籤

- 完成指定選項之後，按一下 確定 儲存登入帳戶。要看新的登入帳戶和其他登入帳戶，可以在 Enterprise Manager 中選取 登入 資料夾。在右邊的選單中會列出所有登入帳戶。

使用 T-SQL 建立登入帳戶

使用 T-SQL 可以建立登入帳戶，需要使用 sp_addlogin 預存程序或sp_grantlogin 預存程序。sp_addlogin 預存程序只能將 SQL Server 驗證過的使用者加入 SQL Server 資料庫中。sp_grantlogin 預存程序則可以將 Windows NT/2000 驗證過的使用者加入。

sp_addlogin 預存程序的語法如下：

    sp_addlogin  [@loginame =] 'login'
            [ , [ @passwd = ] 'password'  ]
            [ , [ @defdb = ] 'database'  ]
            [ , [@deflanguage = ] 'language'  ]
            [ , [ @sid = ]'sid'  ]
            [ , [ @encryptopt = ] 'encryptionoption'  ]

可選擇的參數如下：

- 密碼 指定 SQL Server 登入帳戶密碼。預設值為 NULL。
- 資料庫 指定登入帳戶的預設資料庫。預設值為 master 資料庫。
- 語言 指定登入帳戶的預設語言。預設值為現有的 SQL Server 語言設定。
- 安全性識別碼 （sid）　指定安全性識別碼（一個唯一的數值）。如果沒有指定這個數值，系統將會自動產生一個數值。使用者通常不使用 sid 參數，但是管理員可能在一些情況下會使用到 sid 。當 DBA 執行疑難排解任務時，可能需要使用 sid ，以確定正在檢查哪個登入帳戶。 sid 參數是登入帳戶的內部識別碼。
- encryptopt_option　指定是否在系統資料表中將密碼加密。預設值為NULL，表示密碼被加密。指定 skip_encryption 表示密碼沒有加密。如果指定 skip_encryption_old，那麼在較早版本的 SQL Server 中已加密的密碼將不再被加密。只有在想要避免加密系統資料表中的密碼時，才需要更改這個設定。

下面是一個簡單的新增登入帳戶的範例：

    EXEC sp_addlogin 'PatB'

記住在預存程序名稱前要使用 EXEC 關鍵字。

下面是一個較複雜的新增登入帳戶範例。

    sp_addlogin 'SharonR','mypassword','Northwind','us_english'

這個命令建立了名叫 SharonR 的使用者，使用 mypassword 密碼。預設資料庫為 Northwind，預設語言為 U.S. English。一般而言，讓 SQL Server 來建立安全性識別比您自己來建立要好些。

sp_grantlogin 預存程序有下列語法：

    sp_grantlogin 'login_name'

使用 sp_grantlogin 預存程序的範例如下：

    EXEC sp_grantlogin 'MOUNTAIN_DEW\DickB'

在增加了這些登入帳戶之後，在左邊的窗格中選取 登入 資料夾，以便在Enterprise Manger 中檢視這些登入帳戶。

使用建立登入精靈

可依下列步驟，利用 建立登入精靈 建立 SQL Server 登入帳戶：

1. 展開一個伺服器群組，並選取一個伺服器。在 工具 功能表中選擇 精靈 。在 選擇精靈 對話方塊中展開 資料庫 資料夾，選擇 建立登入精靈 ，如圖34-5所示，按 確定 。此時將顯示 歡迎使用建立登入精靈 ，如圖34-6所示。

   圖34-5　選擇精靈畫面

   圖34-6　歡迎使用建立登入精靈畫面

2. 按 下一步 進入 選取這個登入的驗證模式 畫面，如圖34-7所示。在這個畫面中，您可以指定是否使用 Windows 驗證或 SQL Server 驗證（混合模式）。

   圖34-7　選取這個登入的驗證模式畫面

3. 按 下一步 進入 使用Windows NT的帳戶驗證 畫面或 使用SQL Server的驗證 畫面，出現的畫面取決於步驟 2 中選取的驗證模式。圖34-8顯示稍後的畫面。在這個畫面中指定登入 ID 和密碼。如果選擇的是 Windows NT 驗證，請鍵入網域名稱和使用者帳戶名稱。

   圖34-8　使用 SQL Server 的驗證畫面

4. 按 下一步 ，顯示 同意對安全性角色的存取 畫面，如圖34-9所示。在這個畫面中，可以選取分配到該登入帳戶上的資料庫角色。

   圖34-9　同意對安全性角色的存取畫面

5. 按 下一步 進入 同意對資料庫進行存取畫面 ，如圖34-10所示。在這個畫面中可以選取登入帳戶可以存取的資料庫。

   圖34-10　同意對資料庫進行存取畫面

6. 按 下一步 進入 完成建立登入精靈 畫面，如圖34-11所示，這裏可以在文字方塊中檢查摘要資訊。要變更設定可按 上一步 回到之前的畫面，按 完成 即可完成建立新登入帳戶。

   圖34-11　完成建立登入精靈畫面

建立 SQL Server 使用者

SQL Server 使用者可以利用 Enterprise Manager 或 T-SQL 建立。（在 SQL Server 中並沒有用來完成這項設定的精靈）。本節中將利用這兩種方式建立 SQL Server 使用者。請記住，SQL Server 使用者是為特定的資料庫所定義，且特定的使用者登入名稱對該資料庫有不同的使用權限。SQL Server 使用者 ID 可被視為 SQL Server 登入帳戶的同義詞，但是在登入時兩者並不需要使用相同的名稱。

說明

建立 SQL Server 使用者前，必須先為該使用者定義 SQL Server 登入帳戶，因為使用者名稱需參照 SQL Server 登入帳戶。

使用 Enterprise Manager 建立使用者

與 SQL Server 登入帳戶不同的是，登入帳戶是在 Enterprise Manager 的 Security 資料夾中建立的，而 SQL Server 使用者則在 Enterprise Manager 左側選單的指定資料庫檔案夾中建立。要使用 Enterprise Manager 建立使用者，請按照下列步驟操作：

1. 在需要建立使用者的資料庫上按一下滑鼠右鈕，在快顯功能表中選擇 新增 ，然後選擇 資料庫使用者 ，進入 資料庫使用者屬性 視窗，如圖34-12所示。在 登入名稱 下拉式清單中鍵入一個有效的 SQL Server 登入帳戶名稱，並在 使用者名稱 文字方塊中鍵入新的使用者名稱。在 資料庫角色使用權限 清單中選取合適的核取方塊，為新使用者分配資料庫角色。在本章的後面可以看到，為這些角色分配權限，便能夠將權限套用到使用者上。

   圖34-12　資料庫使用者屬性畫面

2. 按下 屬性 按鈕進入 資料庫角色屬性 畫面，如圖34-13所示。在這個視窗中可以更改選取的資料庫角色。這個任務將在本章的 ＜管理資料庫角色＞ 一節中解釋。

   圖34-13　資料庫角色屬性畫面

3. 在我們完成了這些設定選項後，按兩次 確定 即可建立資料庫使用者。

使用 T-SQL 建立使用者

要使用 T-SQL 建立資料庫使用者，可以執行 sp_adduse 預存程序。這個預存程序可以在 ISQL 或 OSQL 中執行，語法如下：

    sp_adduser [ @loginame = ] 'login'
         [ , [ @name_in_db = ] 'user' ]
    　　 [ , [ @grpname = ] 'group' ]

Login 這個參數是 SQL Server 登入帳戶的名稱，是必須提供的資料。user 變數是新的使用者名稱，group 則是新使用者所隸屬的群組或角色。如果沒有指定 user 值，那麼它的值會與 login 參數相同。

下面的命令建立了一個新的資料庫使用者，其名稱為 JackR 和 Windows NT 或Windows 2000 帳戶 FORT_WORTH\DB_User：

    sp_adduser 'FORT_WORTH\DB_User', 'JackR'

FORT_WORTH 是系統或者網域名稱，而 DB_User 是 Windows NT 或Windows 2000 帳戶名稱。

管理資料庫存取權限

存取權限 （permissions）用來控制資料庫物件的存取，並指定可操作特定資料庫操作的使用者。可以將伺服器和資料庫存取權限都設定。伺服器存取權限允許 DBA 執行資料庫管理任務，資料庫存取權限則是用來允許或者禁止存取資料庫物件和陳述式。本節中將討論存取權限的類型，以及如何分配存取權限。

伺服器存取權限

伺服器存取權限是分配給 DBA，允許DBA執行管理任務。這些存取權限定義在固定伺服器角色。使用者登入帳戶也可以分配給固定伺服器角色，但是這些角色不能被更改。（在本章稍後的

＜使用固定的伺服器角色＞ 一節中將討論伺服器角色。）伺服器存取權限包括 SHUTDOWN、CREATE DATABASE、BACKUP DATABASE 和 CHECKPOINT 存取權限。伺服器存取權限只能授權 DBA 作為執行管理任務使用，而不需要更改或者授予個人使用者。

資料庫物件存取權限

資料庫物件權限是權限類型中，屬於允許資料庫物件存取的類型。在存取資料表或檢視使用 SQL 陳述式（如 SELECT、INSERT、UPDATE 和 DELETE）存取物件時，就需要使用物件存取權限。使用 EXECUTE 陳述式執行預存程序時也需要物件存取權限。

使用 Enterprise Manager 指定物件存取權限

要使用 Enterprise Manager 將資料庫物件存取權限授予使用者，請按照下列步驟操作：

1. 展開伺服器群組，展開一個伺服器，展開需要分配存取權限的資料庫，然後選取 使用者 資料夾。在右邊窗格中會列出使用者。請在使用者名稱上按一下滑鼠右鈕，並從快顯功能表中選擇 內容 ，進入 資料庫使用者屬性 視窗，如圖34-14所示。

   圖34-14　「資料庫使用者屬性」視窗

2. 按下 權限 按鈕，進入 資料庫使用者屬性 視窗，如圖34-15所示。（也可以在使用者名稱上按一下滑鼠右鈕，從快顯功能表中選擇 所有工作 ，然後選擇 管理使用權限 來進入這個個視窗）。這裏可以管理分配該使用者的存取權限，可以為該使用者分配多種存取權限，利用畫面中的核取方塊指定 SELECT、INSERT、UPDATE、DELETE、EXEC 和 Declarative Referential Integrity（DRI）表單資料列的存取權限。這些物件列在 物件 資料列中。也可以使用畫面上方的選項來列出所有的物件，或只顯示這個使用者有權限的物件。

   圖34-15　資料庫使用者屬性視窗中的權限視窗

使用 T-SQL 分配物件存取權限

執行 GRANT 陳述式，可利用 T-SQL 將物件存取權限指定給使用者。GRANT陳述式的語法如下：

    GRANT  {ALL |  permission}
           [ column ON  {table | view} ] |
           [ ON table（column） ] |
           [ ON view（column） ] |
           [ ON  {stored_procedure | extended_procedure} ]
    TO security_account
           [ WITH GRANT OPTION ]
           [ AS  {group | role} ]

security_account 參數必須是下列帳戶類型之一：

- Microsoft SQL Server使用者
- Microsoft SQL Server角色
- Microsoft Windows NT 或 Windows 2000 使用者
- Windows NT 或 Windows 2000 群組

  使用 GRANT OPTION 關鍵字允許使用者將該權限授予其他使用者。這在授予存取權限給其他的 DBA 時很有用。然而，應該要小心使用 GRANT 選項。

  AS 選項指定要執行 GRANT 陳述式的權限。GRANT 陳述式必須在使用者或角色有被授予權限時才能執行。

  GRANT 陳述式可以按照下面的方式使用：

      GRANT SELECT , INSERT, UPDATE
      ON Customers
      TO Guest
      WITH GRANT OPTION
      AS Accounting

  因為 Accounting 角色可以在 Customers 資料表上授予存取權限，所以要使用AS Accounting 選項。GRANT OPTION 關鍵字讓 MaryW 可將存取權限授予其他的使用者。

  相關資訊

  要檢視 GRANT 陳述式中指定的存取權限清單，請參閱< 線上叢書 >索引中的GRANT。

  使用 T-SQL 撤銷物件存取權限

  您可以用 T-SQL REVOKE 命令來撤銷使用者的物件存取權限。REVOKE 陳述式的語法如下：

      REVOKE [ GRANT OPTION FOR ]
            { ALL [ PRIVILEGES ] | permission }
                  [ column  ON  {table | view} ] |
                  [ ON table（column） ] |
                  [ ON view（column） ] |
                  [ ON   {stored_procedure | extended_procedure} ]
      { TO | FROM }  security_account
                  [ CASCADE ]
                  [ AS  {group | role}  ]

  security_account 參數必須是下列帳戶類型之一：

- Microsoft SQL Server 使用者
- Microsoft SQL Server 角色
- Microsoft Windows NT 或 Windows 2000 使用者
- Windows NT 或 Windows 2000 群組

  與撤銷存取權限相同，GRANT OPTION FOR 選項允許您撤銷之前用 GRANT OPTION 關鍵字授予的存取權限。AS 選項指定要執行 REVOKE 陳述式的權限。

  以下是使用 REVOKE 陳述式的範例：

      REVOKE ALL
      ON     Customers
      TO     MaryW

  REVOKE AL L陳述式將移除在 Customers 資料表中使用者 MaryW 擁有的所有存取權限。

  相關資訊

  要檢視在 REVOKE 陳述式中指定的存取權限清單，請查閱《線上叢書》索引中的 REVOKE。

  資料庫陳述式存取權限

  除了資料庫物件存取權限，您還可以分配陳述式存取權限。物件存取權限讓使用者存取資料庫中現存的物件，而陳述式存取權限則授權使用者建立資料庫物件，包括資料庫和資料表。陳述式存取權限如下：

- BACKUP DATABASE 執行 BACKUP DATABASE 命令
- BACKUP LOG 執行 BACKUP LOG 命令
- CREATE DATABASE 用來建立新的資料庫
- CREATE DEFAULT 用來建立可關聯至欄位的預設值
- CREATE PROCEDURE 用來建立預存程序
- CREATE RULE 用來建立規則
- CREATE TABLE 用來建立新的資料表
- CREATE VIEW 用來建立新的檢視

  陳述式存取權限可以用 Enterprise Manager 或 T-SQL 分配。

  使用 Enterprise Manager 分配陳述式存取權限

  要使用 Enterprise Manager 為使用者授予資料庫的陳述式存取權限，請按照下列步驟操作：

  1. 展開一個伺服器群組，展開一個伺服器，然後展開 資料庫 資料夾。在需要分配存取權限的資料庫上按一下滑鼠右鈕，並從快顯功能表中選擇 內容 ，顯示資料庫的屬性視窗，如圖34-16所示。

     圖34-16　資料庫的屬性視窗

  2. 選取 權限 頁籤，如圖34-17所示。在這裏可以為存取該資料庫的使用者分配存取權限。這些資料列包含核取方塊，規定了所要分配的陳述式存取權限，而 使用者/角色 欄位列出了存取這個資料庫的使用者和角色。

     圖34-17　資料庫屬性視窗的權限頁籤

  使用 T-SQL 分配陳述式存取權限

  您可以使用 GRANT T-SQL 陳述式為使用者分配陳述式存取權限。GRANT 陳述式的語法如下：

      GRANT { ALL | statement }
      TO    security_account

  可以分配給使用者的陳述式存取權限包括 CREATE DATABASE、CREATE DEFAULT、CREATE PROCEDURE、CTEATE RULE、CREATE TABLE、CREATE VIEW、BACKUP DATABASE 和 BACKUP LOG，如前所述。例如要為使用者帳戶 Elea 新增 CREATE DATABASE和CREATE TABLE 陳述式存取權限，請使用下面的命令：

      GRANT CREATE DATABASE,CREATE TABLE
      TO    'Elea'

  所以，為使用者帳戶新增陳述式存取權限其實並不困難。

  使用 T-SQL 撤銷陳述式存取權限

  您也可以使用 T-SQL 陳述式 REVOKE 來撤銷使用者帳戶的陳述式存取權限。REVOKE 陳述式的語法如下：

      REVOKE { ALL | statement }
      FROM   security_account

  例如，要從使用者帳戶 Elea 上撤銷 CREATE DATABASE 陳述式存取權限，可使用下列命令：

      REVOKE CREATE DATABASE
      FROM   'Elea'

  正如所見，撤銷使用者的陳述式存取權限也不是個複雜的過程。

  管理資料庫角色

  使用資料庫角色可以簡化管理使用者存取權限的工作。資料庫角色就是設計用來允許一組使用者接受同樣的資料庫存取權限，這樣便不需要個別的分配這些存取權限。不要分配給每個使用者個人的存取權限，可以為一組使用者建立角色，然後分配存取權限。

  角色是為了特殊的工作群組、工作類別或工作任務而設計。在這種情況下，根據新使用者所執行的工作，它們可以成為一個或多個資料庫角色的成員。例如，角色可能定義成工作類別，如支付性帳戶、接受性帳戶、工程以及人力資源等。當一個使用者加入這些部門或群組中時，他或她就被分配為這個角色的一個成員。一個使用者可以是一個或多個角色的成員，但是並不一定要求使用者成為某一角色的成員。除了成為資料庫角色的成員以外，使用者也可以分配個人存取權限。

  建立和修改角色

  和 DBA 所執行的大多數任務一樣，建立和修改資料庫角色也可以透過Enterprise Manager 或 T-SQL 命令來完成。（SQL Server 沒有提供這一類的精靈。）這兩種方法必須完成同樣的例行性任務：

- 建立資料庫角色。
- 為角色分配存取權限。
- 為角色分配使用者。

  當檢視角色時，可以看到分配給角色的存取權限和分配給角色的使用者。

  使用 Enterprise Manager 管理角色

  要使用 Enterprise Manager 建立資料庫角色，請按照下列步驟操作：

  1. 展開一個伺服器群組，展開一個伺服器，然後展開 資料庫 資料夾。在需要建立角色的資料庫上按一下滑鼠右鈕（本範例使用 Northwind），並從快顯功能表中選擇 新增 ，接著選擇 資料庫角色 。另外一種方法，可以展開資料庫，在 角色 上按一下滑鼠右鈕，並從快顯功能表中選擇 新增資料庫角色 。這兩種方法都可進入 資料庫角色屬性 視窗，如圖34-18所示。

     圖34-18　「資料庫角色屬性」視窗

  2. 在 名稱 文字方塊中鍵入名稱來為角色分配描述性名稱－請選擇一個有助於記住角色功能的名稱。
  3. 按一下 新增 為角色分配使用者。這時將會顯示可以存取該資料庫的使用者帳戶清單，如圖34-19所示。選取要分配給該角色的使用者。如果要取消選擇使用者，只要在使用者名稱上再按一下就可以了。在完成修改角色成員後，按一下 確定 即可建立了新角色。現在返回 Enterprise Manager 視窗中。

     圖34-19　新增角色成員對話方塊

  4. 要為角色分配存取權限，先展開 角色 資料夾開啟 資料庫角色屬性 視窗，在角色名稱上按一下滑鼠右鈕，並從快顯功能表中選擇 內容 。然後按一下 權限 ，進入 資料庫角色屬性 - Northwind 視窗，如圖34-20所示。

  在這個視窗中，可以為資料庫中的物件角色分配不同的存取權限。選擇清單中適合的核取方塊。資料庫物件是列在 物件 資料列中的。選擇視窗上方的選項可以檢視所有的物件，或是列出這個角色有權限的物件。一旦分配了一個角色給某個使用者，使用者就獲得了分配給這個角色的所有存取權限。

  在建立了角色後，可以在 資料庫角色屬性 視窗中修改。要修改角色，請按照為角色增加存取權限的步驟操作。也可以在 資料庫角色屬性 視窗中新增以及刪除使用者和存取權限。

  使用 T-SQL 管理角色

  也可以使用 sp_addrole 預存程序來建立角色。sp_addrole 預存程序的語法如下：

      sp_addrole [ @rolename = ] 'role'
             [ , [ @ownername = ]  'owner' ]

  圖34-20　資料庫角色屬性 - Northwind視窗

  例如，要在 Northwind 資料庫中加入一個名稱為 readonly 的角色，請使用下列 T-SQL 命令：

      USE Northwind
      GO
      sp_addrole 'readonly' , 'dbo'
      GO

  USE Northwind 命令選取 Northwind 為目前資料庫。如果沒有指定資料庫，那麼在預設資料庫中會建立角色。

  這個預存程序只能建立角色。要為角色增加存取權限，請使用前面描述的 GRANT 陳述式。要為角色刪除存取權限，請使用 REVOKE 陳述式。

  例如，要為 readonly 角色增加 Employees、Customers 和 Orders 資料表的SELECT 存取權限，請使用下列的 GRANT 陳述式：

      USE Northwind
      GO
      GRANT SELECT
      ON    Employees
      TO    readonly
      GO
      GRANT SELECT
      ON    Customers
      TO    readonly
      GO
      GRANT SELECT
      ON    Orders
      TO    readonly
      GO

  要為角色增加使用者，請使用 sp_addrolemember 預存程序。sp_addrolemember 預存程序的語法如下：

      sp_addrolemember 'role','security_account'

  下列命令可為 readonly 角色增加使用者：

      USE Northwind
      GO
      sp_addrolemember 'readonly' , 'Guest'
      GO

  使用固定的伺服器角色

  在 SQL Server 安裝時，建立了大量預先定義的伺服器角色。這些固定伺服器角色被用來授予存取權限給 DBA，這些角色包含了伺服器存取權限以及物件和陳述式存取權限，清單如下：

- bulkadmin　可以執行大量插入
- dbcreator　可以建立和變更資料庫
- diskadmin　可以管理磁碟檔案
- processadmin　可以管理S QL Server 程序
- securityadmin　可以管理登入帳戶和建立資料庫存取權限
- serveradmin　可以設定任何伺服器選項，並且可以關閉資料庫
- setupadmin　可以管理連結的伺服器和啟動程序
- sysadmin　可以執行任何伺服器行為

  為使用者帳戶分配固定伺服器角色，可讓使用者執行角色所擁有存取權限的管理任務。依需要讓所有的DBA使用相同的管理帳戶可能會更好些。與資料庫角色相比，固定伺服器角色比個人存取權限更容易維護，但是固定伺服器角色是不能修改的。您可以按照下列步驟為一個使用者分配固定伺服器角色。

  1. 在 Enterprise Manager 中展開一個伺服器群組，展開一個伺服器，展開 安全性 資料夾，然後選取 伺服器角色 。在需要加入使用者的固定伺服器角色上按滑鼠右鈕，並從快顯功能表中選擇 內容 ，進入 伺服器角色 視窗，如圖34-21所示。

     圖34-21　伺服器角色視窗

  2. 按 新增 ，為新增的使用者帳戶分配固定伺服器角色。這將呼叫 新增成員 對話方塊，如圖34-22所示。

     圖34-22　新增成員對話方塊

  3. 選取了需要加入固定伺服器角色的使用者之後，按一下 確定 ，返回 伺服器角色屬性 視窗。請按一下 確定 為安全性角色新增使用者。

  安全性帳戶授權

  SQL Server 2000 使用 Kerberos 安全模式建立安全性。（關於 Kerberos 安全模式的資訊可參閱

  第 2 章 。）SQL Server 2000 使用 Kerberos 通訊協定來支援用戶端與伺服器之間的相互認證。這使得用戶端的安全識別能夠在電腦之間流通，於是就可連接到不同的伺服器上；登入新的伺服器時，可使用個人化的用戶識別進行資料的存取。這就是安全性帳戶授權。

  我們來看一個安全性帳戶授權的例子。假定一個用戶連接到 Server A 為NTDOMAIN\AlexR，而 ServerA 又與 ServerB 相連接。那麼 ServerB 就知道連接的安全性識別為 NTDOMAIN\AlexR。這減少了用戶登入到 ServerB 的需求。

  如果要使用安全性帳戶授權，所連接的所有伺服器都必須能夠執行 Windows 2000，並支援 Kerberos，而且您必須正在使用 Active Directory 服務。下列選項必須在 Active Directory 中設定，以便進行授權：

- 帳戶敏感無法授權 要求授權的使用者絕對不能選擇這個選項。
- 帳戶可以授權 SQL Server 2000 的伺服器帳戶一定要選這個選項。
- 電腦可以授權 執行 SQL Server 2000 的伺服器一定要選這個選項。

  設定 SQL Server

  在使用安全性帳戶授權之前，必須先設定 SQL Server 2000 來接受授權。授權促成彼此相互確認。要使用安全性帳戶授權，SQL Server 2000 必須有 Windows 2000 帳戶網域管理員分配的 Service Principal Name（SPN）。SPN 必須分配到電腦上 SQL server 的伺服器帳戶。SPN 必須證明 SQL server 是經由特定伺服器以及 Windows 2000 帳戶網域管理員認證的。您可以讓您的網域管理員使用在 Windows 2000 Resource Kit 上取得的 Setspn 公共程式，來為 SQL Server 建立一個 SPN。

  要建立 SPN，請執行下列命令:

      setspn -A MSSQLSvc/Host:port serviceaccount

  以下為使用這個命令的範例：

      setspn -A MSSQLSvc/MyServer.MyDomain.MyCompany.com sqlaccount

  相關資訊

  關於 Setspn 公用程式的相關資訊，請參閱 Windows 2000 文件。

  您也必須用 TCP/IP 來使用安全性帳戶授權，不能使用已命名的管道，因為 SPN要使用特定的 TCP/IP 通訊端。如果使用多重連接埠，每個連接埠都必須有 SPN。

  您可以用 LocalSystem 帳戶授權。SQL Server 將在伺服器啟動時自己註冊登記，並且自動登記 SPN。這個選項比使用網域的使用者帳戶來授權還要容易。然而，當 SQL Server 關閉時，SPN 將無法替 LocalSystem 帳戶註冊。為了在 LocalSystem 帳戶之下授權，請在 Setspn 公用程式中執行下列命令：

      setspn -A MSSQLSvc/Host:port serviceaccount

  說明

  如果您要在 SQL Server 2000 中變更伺服器帳戶，您必須刪除之前定義的SPN，然後建立新的帳戶。

  本章總結

  本章學習了 SQL Server 使用者和安全性管理，也看到了如何使用資料庫登入帳戶和資料庫使用者帳戶允許資料庫的存取。此外還學習如何建立與管理登入帳戶和資料庫使用者，並學到了如何利用資料庫角色簡化使用者管理，並依照工作性質分配角色的存取權限。角色可以分配給多個使用者，讓分配存取權限和修改變得更加容易。此外也看到了被稱為固定伺服器角色的特殊角色，這些角色是用來為使用者和 DBA 分配管理存取權限。最後我們看到了在 SQL Server 2000 中安全性的提昇，使得伺服器之間的安全性帳戶更能夠安全地流通。在

  第 35 章 中，我們將學習 SQL 預存程序以及如何調校 SQL 查詢。