201002200252『SQL』Policy Based Management - 檢查資料表命名
在 MS SQL 裡提供了 Policy Based Management,他可以用來設定 Policy 去管理你的 SQL Server。今天就用簡單的例子(檢查資料表的命名是否符合規則),來說明怎麼使用 Policy。
一個資料庫系統,可能同時有許多開發人員與線上的系統在使用,慢慢的系統越掛越多,所被創造的資料表名稱也多元化,如果遇上幾個天兵,資料表或資料庫物件的名稱肯定亂的要命,單看名稱根本不知道這個物件是 View 、Table、Function 還是 Store Procedure.
Policy Management 的限制、檢查功能相當相當的強大,本例子(檢查資料表的命名是否符合規則)只是個小小的運用,不過所建立的條件(Condition)或規則(policy)步驟卻是差不多的。
↓ 1st:建立新的條件
↓ 2nd:設定條件的內容,請一下列 1-5 的步骤建立
若你發生如上圖的步驟6與7,沒辦法按下ok與有錯誤訊息的提示「Property 'ExpressionNode' is not set」,表示你所給的內容有誤
↓ 3rd:點選錯誤訊息的右方向下鍵,可以瀏覽目前所有的錯誤
↓ 哦~原來上面的錯誤在 Value 的內容忘了給單引號,這裡要跟下 T-SQL 一樣,對於比對內容要給單引號唷!
↓ 4th:建立好 Condition ,下一步就是建立 New Policy
↓ 5th:給定 Policy Name 與要套用的 Condition
↓ 6th:在步驟5選定好條件後,下面「套用對象 Against targets」預設為每一個資料庫的每一個資料表(Every table in every database)。不過我在下圖中,對套用的資料庫有設限針對 northwind,這一小點就給各位玩玩看囉!
↓ 7th:建立好 Condition 與 policy 後,在來就是要 Enable 啟動了
↓ 不過我在步驟6的圖中,選用的方式是「On demand」,就無法用 Enable 的方式來執行。
↓ 8th:這時請針對 Policy 按右鍵,執行「Evaluate」去評估、檢查,你所 Against Targets 的對象,是否都符合 policy
↓ 9th:都符合就會得到下面綠燈的表示。也因為我套用的資料庫的資料表只有一個,且符合條件,所以底下只出現一筆。
↓ 若你選擇「Evaluation Mode = On Schedule」,他就會出現下圖左邊的視窗,問你要檢查的期限。
上述使用 policy management 去檢查已建立的資料表名稱是否符合規定的命名規則,真的只是九牛一毛的功能說明,各位可以多多去嘗試不同的 condition 與 policy ,整個動作的順序步驟是一樣的。
~End
-------底下簡列Policy 動作 對應的 T-SQL 語法---------------
Declare @object_set_id int
EXEC msdb.dbo.sp_syspolicy_add_object_set
@object_set_name=N'Table Name Prefix_ObjectSet',
@facet=N'Table', @object_set_id=@object_set_id
OUTPUT
Select @object_set_id
Declare @target_set_id int
EXEC msdb.dbo.sp_syspolicy_add_target_set @object_set_name=N'Table Name Prefix_ObjectSet',
@type_skeleton=N'Server/Database/Table', @type=N'TABLE', @enabled=True, @target_set_id=@target_set_id OUTPUT
Select @target_set_id
EXEC msdb.dbo.sp_syspolicy_add_target_set_level @target_set_id=@target_set_id, @type_skeleton=N'Server/Database/Table',
@level_name=N'Table', @condition_name=N'',
@target_set_level_id=0
EXEC msdb.dbo.sp_syspolicy_add_target_set_level @target_set_id=@target_set_id, @type_skeleton=N'Server/Database',
@level_name=N'Database', @condition_name=N'northwind',
@target_set_level_id=0
GO
Declare @policy_id int
EXEC msdb.dbo.sp_syspolicy_add_policy @name=N'Table Name Prefix',
@condition_name=N'Table
Name Prefix', @policy_category=N'', @description=N'', @help_text=N'', @help_link=N'', @schedule_uid=N'00000000-0000-0000-0000-000000000000', @execution_mode=0, @is_enabled=False, @policy_id=@policy_id
OUTPUT,
@root_condition_name=N'', @object_set=N'Table Name Prefix_ObjectSet'
Select @policy_id
GO
------------
Declare @condition_id int
EXEC msdb.dbo.sp_syspolicy_add_condition @name=N'Table Name Prefix',
@description=N'', @facet=N'Table', @expression=N'<Operator>
<TypeClass>Bool</TypeClass>
<OpType>LIKE</OpType>
<Count>2</Count>
<Attribute>
<TypeClass>String</TypeClass>
<Name>Name</Name>
</Attribute>
<Constant>
<TypeClass>String</TypeClass>
<ObjType>System.String</ObjType>
<Value>tbl_%</Value>
</Constant>
</Operator>', @is_name_condition=2, @obj_name=N'tbl_%', @condition_id=@condition_id
OUTPUT
Select @condition_id
GO
---------------
Declare @condition_id int
EXEC msdb.dbo.sp_syspolicy_add_condition @name=N'northwind',
@description=N'', @facet=N'Database',
@expression=N'<Operator>
<TypeClass>Bool</TypeClass>
<OpType>EQ</OpType>
<Count>2</Count>
<Attribute>
<TypeClass>String</TypeClass>
<Name>Name</Name>
</Attribute>
<Constant>
<TypeClass>String</TypeClass>
<ObjType>System.String</ObjType>
<Value>northwind</Value>
</Constant>
</Operator>', @is_name_condition=1, @obj_name=N'northwind', @condition_id=@condition_id
OUTPUT
Select @condition_id
GO