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 

回應
Google Search
Google
平均分數:0 顆星
投票人數:0
我要評分:
Google