レッスン 2: 名前付け基準ポリシーの作成と適用
適用対象 SQL Server
ポリシー ベースの管理の一部の種類のポリシーでは、ポリシーへの今後の準拠を適用するためのトリガーを作成することができます。 このレッスンでは、テーブルの名前付け基準を適用するポリシーを作成します。 その後に、ポリシーに違反するテーブルを作成してポリシーをテストします。
前提条件
このチュートリアルを完了するには、SQL Server Management Studio と SQL Server を実行しているサーバーへのアクセスが必要です。
- SQL Server Management Studio をインストールします。
- SQL Server 2017 Developer Edition をインストールします。
Finance データベースの作成
Management Studio でクエリ ウィンドウを開き、次のステートメントを実行します。
CREATE DATABASE Finance ; GO
オブジェクト エクスプローラーで、 [データベース]をクリックし、F5 キーを押してデータベースの一覧を更新します。
Finance テーブルの条件の作成
- オブジェクト エクスプローラーで、 [管理]、 [ポリシー管理]の順に展開し、 [条件]を右クリックして [新しい条件]をクリックします。
[新しい条件の作成] ダイアログ ボックスで、 [名前] ボックスに「 Finance のテーブル」と入力します。
- [ファセット] ボックスの一覧で [マルチパート名]を選択します。
- すべてのテーブル名が文字列 fintbl で始まるように、[式] 領域の [フィールド] ボックスで @Name を選択し、[演算子] ボックスで [次のパターンに一致] を選択し、[値] ボックスに「
'fintbl%'
」と入力します。 - [説明] ページで、「 Finance のテーブル名は必ず fintbl で始める」と入力し、 [OK] をクリックして条件を作成します。
Finace Name ポリシーの作成
- オブジェクト エクスプローラーで [ポリシー]を右クリックし、 [新しいポリシー]をクリックします。
[新しいポリシーの作成] ダイアログ ボックスで、 [名前] ボックスに「 Finance の名前」と入力します。
- [条件の確認] ボックスの一覧で、 [Finance のテーブル]を選択します。 このボックスは [マルチパート名] 領域にあります。
- [対象] 領域に、このポリシーを適用できるデータベース オブジェクトの一覧が表示されます。 [すべてのテーブル]のチェック ボックスをオンにします。
- [有効] チェック ボックスをオンにします ( [要求時] ポリシーには [有効] ボックスが適用されません)。
- [評価モード] の一覧で、 [変更時: 回避]を選択します。 これにより、Finance データベースでデータベース トリガーを作成することでポリシーが適用されるようになります。
- [サーバーの制限] ボックスの一覧で [なし]を選択します。
- [説明] ページで、'Table names in the Finance database must contain 'fintbl%' (Finance データベースのテーブル名には 'fintbl%' が含まれている必要があります。) の説明を追加します。
- [全般] ページに戻り、[すべてのデータベース] 領域で [すべて] を展開し、[新しい条件] をクリックします。
[新しい条件の作成] ダイアログ ボックスで、 [名前] ボックスに「 Finance データベース」と入力します。
- [式] ボックスで、@Name = 'Finance' を追加して式を完成させ、[OK] をクリックして条件ページを閉じます。
Note
Tab キーを押して [値] ボックスから移動しないと、 [OK] ボタンが有効にならない場合があります。
[OK] を選択します。
Finance ポリシー カテゴリの作成
- オブジェクト エクスプローラーで [管理]を展開し、 [ポリシー管理]を右クリックして、 [カテゴリの管理]をクリックします。
[ポリシー カテゴリの管理] ダイアログ ボックスで、 [名前]の下の空白のボックスに「 Finance 」と入力し、 [データベースのサブスクリプションの要求]チェック ボックスをオフにします。 [データベースのサブスクリプションの要求] では、インスタンス内のすべてのデータベースは、このポリシー カテゴリに属するポリシーをサブスクライブします。 このレッスンでは、Finance の名前ポリシーをサブスクライブするのは Finance データベースだけです。
[OK] を選択します。
Finance ポリシー カテゴリのサブスクライブ
- オブジェクト エクスプローラーで [データベース]を展開し、 [Finance]を右クリックして、 [ポリシー]をポイントし、 [カテゴリ]をクリックします。
- Finance カテゴリの [サブスクライブ済み] チェック ボックスをオンにします。
- [OK] を選択します。
Finance Name ポリシーの強制のテスト
Management Studio で、クエリ ウィンドウを開きます。 Finance の名前 ポリシーに違反するテーブルの作成を試みる次のステートメントを実行します。 このテーブルは、テーブル名が文字列 fintblで始まっていないため、ポリシーに違反します。
USE Finance ; GO CREATE TABLE NewTable (Col1 int) ; GO
ポリシーにより、テーブルの作成が防止され、ポリシー名を含む情報メッセージが返されます。
Policy 'Finance Name' has been violated by 'SQLSERVER:\SQL\SQL\SQL2017\Databases\Finance\Tables\dbo.NewTable'.
This transaction will be rolled back.
Policy condition: '@Name LIKE 'fintbl%''
Policy description: 'Tables names in the Finance database must contain 'fintbl%''.
Additional help: '' : ''
Statement: 'CREATE TABLE NewTable
(Col1 int)'.
Msg 515, Level 16, State 2, Procedure msdb.sys.sp_syspolicy_execute_policy, Line 69 [Batch Start Line 2]
Cannot insert the value NULL into column 'target_query_expression', table 'msdb.dbo.syspolicy_policy_execution_history_details_internal'; column does not allow nulls. INSERT fails.
The statement has been terminated.
有効な名前を指定するには、コードを次のように変更し、ステートメントを再度実行します。
USE Finance ; GO CREATE TABLE fintblNewTable (Col1 int) ; GO
今度はテーブルが作成されます。
サーバー全体へのポリシーの適用
現在、Finance ポリシー カテゴリをサブスクライブするのは Finance データベースだけです。 多くの場合、ポリシー カテゴリをサーバー全体に適用する方が簡単です。 オブジェクト エクスプローラーで [管理]を展開し、 [ポリシー管理]を右クリックして、 [カテゴリの管理]をクリックします。
[ポリシー カテゴリの管理] ダイアログ ボックスで Finance カテゴリを探し、Finance カテゴリの [データベースのサブスクリプションの要求] チェック ボックスをオンにします。
[OK] を選択します。 これで Finance カテゴリがすべてのデータベースに適用されるようになります。ただし、作成した条件により、Finance の名前ポリシーは Finance データベースにのみ適用されることになります。 これは、条件を複雑に組み合わせることで、多数のサーバーに対して適切な方法でポリシーを適用できるということを示しています。
まとめ
このチュートリアルでは、ポリシー ベースの管理の条件、ポリシー、およびポリシー グループを作成する方法と、フィルターを適用してポリシー ベースの管理対象がポリシーに準拠しているかどうかを調べる方法について学習しました。
次へ
このチュートリアルはこれで終了です。 最初に戻るには、「チュートリアル: ポリシー ベースの管理を使用したサーバーの管理」を参照してください。
チュートリアルの一覧については、「 SQL Server 2016 チュートリアル」を参照してください。