SlideShare ist ein Scribd-Unternehmen logo
1 von 28
データを追っかけよう! ~変更データキャプチャ と 変更の追跡 を使ってみた~ 2011/01/29 お だ
今日のゴール 変更を確認する方法(2種類)の違いが雰囲気わかる。 検証/デバッグ時にデータの変遷を確認する事が多分出来る。 頑張れば SQL Server – 他DB の同期が出来る?
データの変更って? DML(Data Manipulation Language)の変更を追跡する 追加操作 (INSERT) 変更操作 (UPDATE) 削除操作 (DELETE) ※検索(SELECT) は含まない! そもそも DML ってデータの参照は含まない? SQL Server 2008R2 では http://msdn.microsoft.com/ja-jp/library/ff848766.aspx SQL Server Comapctでは http://msdn.microsoft.com/ja-jp/library/ms174439(v=SQL.100).aspx
変更を確認するには データ変更キャプチャ (Change Data Capture) 変更の追跡 (Change Tracking) SQL Server 2008 から追加された それ以前は・・・トリガー等で実装?
変更データキャプチャ(CDC) 使えるエディションに制限がある ,[object Object],変更されたという記録と、変更されたデータも保持。 Standard Edition では使えないので、 本番環境で利用したい場合は注意! 履歴データを持っている。
変更の追跡(Change Tracking) 使えるエディションに制限がなさそう ,[object Object],変更されたという記録しか保持しない。 PK が無いテーブルは利用出来ない。 変更されたデータは保持しない!
変更履歴を保持しないと… 差分比較しか出来ない。 起点となるデータ(前回のスナップショット等)から現在のデータに対しての比較しか出来ない。 一トランザクション内での同一データへの複数回更新はハンドリング出来ない。 トランザクション終了時点で、開始前と比べてどうなったか?しか保持していない。例:UPDATE後に DELETE した場合は、DELETE 扱い データサイズが少なくて済む。
CDC を使ってみる 0. SQL Server Agentを起動する SQL Server Agent が起動していないと、変更データが書き込まれない。 http://msdn.microsoft.com/ja-jp/library/bb522475.aspx 1.データベース で CDC を有効にする システムテーブルやスキーマー、ユーザーに色々と追加される。 テンプレート:Change Data Capture - Configuration - Enable Database for CDC を参考に EXEC sys.sp_cdc_enable_db GO
CDC を使ってみる 2.Capture するテーブルを指定 キャプチャインスタンス名を省略時には、 「スキーマ名_テーブル名」で付けられる。 システムテーブルに、履歴用のテーブルが追加される。 テンプレート:Change Data Capture - Configuration - Enable a Table Naming the Capture Instance を参考に EXEC sys.sp_cdc_enable_table 	@source_schema = N‘スキーマ名', 	@source_name   = N‘テーブル名', 	@role_name     = NULL, -- GatingRole?を使う場合指定する? 	@capture_instance = N‘何か一意な名前‘ -- 省略可能
デモ Agent が起動している状態で INSERT 発行。CDC テーブルにも反映される。 Agent を止めた状態で INSERT を発行。CDC テーブルに反映されない。 Agent を起動すると、さっき INSERT したデータが反映される。 トランザクション内で同一のデータを複数回更新する。
テーブル定義を変更すると… 新しく追加された列(キャプチャ対象として指定されていない列)は無視される キャプチャ対象列が削除されたら? ->履歴データは、以降 NULL が設定される cdc.ddl_historyテーブルに定義が変わった事が書き込まれる ->sys.sp_cdc_get_ddl_historyストアドを使うと、内容を確認出来る。 ->自動では通知してくれなさそう。定期的に監視する必要がある。(今回は開発補助として使うので無問題)
テーブル定義を変更すると… キャプチャインスタンスは、1テーブルに対し最大 2 個まで関連付けることが出来る。 定義を変更したら再度別名でキャプチャインスタンスを作成し、 旧キャプチャインスタンスのデータを移行(INSERT~SELECT)して、削除することで定義の変更にも対応?!
デモ 新しく列を追加後に、更新処理を行う キャプチャ対象の列を削除し、更新処理を行う キャプチャインスタンスをもう一つ作成し、更新処理を行う。 キャプチャインスタンスのデータ移行(旧 -> 新)
CDC を使ってみる 3.キャプチャインスタンスの削除 @capture_instanceに ‘all’ を指定した場合は、テーブルに紐付く全てのキャプチャインスタンスが削除される。 システムテーブルに、履歴用のテーブルが削除される。 テンプレート:Change Data Capture - Configuration - Disable a Capture Instance for a Table を参考に EXEC sys.sp_cdc_disable_table 	@source_schema = N'スキーマ名', 	@source_name   = N‘テーブル名', 	@capture_instance = N‘キャプチャインスタンス名 又は all' GO
CDC を使ってみる 3.データベース で CDC を無効にする キャプチャインスタンスが存在してても、無効に出来る。 履歴用のテーブル等も全削除される。 システムテーブルやスキーマー、ユーザーに色々と追加されたのが削除される。 テンプレート:Change Data Capture - Configuration - Disable Database for CDC  を参考に EXEC sys.sp_cdc_disable_db GO
CDC をちゃんと使いたい… ある期間で変更されたデータを取得する 履歴データの管理(破棄やローテーション) 列の型は何対応してるの? ミラーリング/レプリケーションとか? http://msdn.microsoft.com/ja-jp/library/cc645938.aspx を参考に!
Change Tracking を使ってみる 1.データベースで Tracking を有効化 CHANGE_RENTENTION:数値 単位(DAYS,HOUR,MINUTES) AUTO_CLEANUP:ON,OFF テンプレート:Change Tracking - Set Change Tracking on Database を参考に ALTER DATABASE データベース名SET CHANGE_TRACKING = ON ( 	CHANGE_RETENTION = 2 DAYS, 	AUTO_CLEANUP = ON ) GO SSMS から GUI で設定可能!
Change Tracking を使ってみる 1’.SSMS を使って GUI で設定する
Change Tracking を使ってみる 2.テーブルで Tracking を有効化 TRACK_COLUMNS_UPDATED:ON,OFF 変更した列も記録出来るが使いにくいので、OFF推奨! テンプレート:Change Tracking - Enable Change Tracking on Table を参考に ALTER TABLE スキーマ名.テーブル名 ENABLE CHANGE_TRACKING WITH  ( TRACK_COLUMNS_UPDATED = OFF ) GO SSMS から GUI で設定可能!
Change Tracking を使ってみる 2’.SSMS を使って GUI で設定する
Change Tracking を使ってみる 3.変更を確認する @version は、どの時点からの変更分を確認する。 初回は、最小のバージョン番号を指定する。 SELECT *  FROM CHANGETABLE ( CHANGES [テーブル名], @version ) AS c CHANGE_TRACKING_MIN_VALID_VERSION(  OBJECT_ID(‘スキーマ名.テーブル名') )
Change Tracking を使ってみる 4.変更された列の確認は? Bit マスクで変更されたか確認している! しかも 1列ずつしか出来ない! DECLARE @changeColumnvarbinary(4100) SELECT @changeColumn = c.SYS_CHANGE_COLUMNS FROM CHANGETABLE ( CHANGES [テーブル名], バージョン番号) AS c WHERE ~ SELECT CHANGE_TRACKING_IS_COLUMN_IN_MASK (   COLUMNPROPERTY(     OBJECT_ID(‘スキーマ名.テーブル名’), ‘カラム名', 'ColumnId‘   ) ,@changeColumn-- NULL だと、変更した扱いになる。使えね… )
Change Tracking を使ってみる 5.変更時にマークをつけることが可能 更新時に VARBINARY で設定し、SYS_CHANGE_CONTEXTから CAST して取り出す。 DECLARE @originator_idVARBINARY(128); SET @originator_id = CAST(N'アプリで追加' AS VARBINARY(128)); WITH CHANGE_TRACKING_CONTEXT ( @originator_id ) INSERT INTO ~ SELECT * , CAST(SYS_CHANGE_CONTEXT AS NVARCHAR) FROM CHANGETABLE ( CHANGES [テーブル名], @version ) AS c
デモ CHANGETABLE で違うバージョン番号を渡すと同じデータでも見え方が異なる。(INSERT -> UPDATE 等) 列の変更確認 変更内容の設定/確認
Change Tracking を使ってみる 6.テーブルで Tracking を無効化 SSMS から GUI で設定可能。 テンプレート:Change Tracking - Disable Change Tracking on Table を参考に ALTER TABLE スキーマ名.テーブル名 DISABLE CHANGE_TRACKING GO
Change Tracking を使ってみる 7.データベースで Tracking を無効化 全てのテーブルの Tracking を無効にしていないと、エラーになる。 テンプレート:Change Tracking - Set Change Tracking on Database を参考に ALTER DATABASE データベース名SET CHANGE_TRACKING = OFF GO
まとめ 変更データキャプチャ Enterprise Edition のみ 履歴も保持する テンプレートが充実 変更の追跡 Express Edition でもOK 履歴は保持しない テンプレートが少ない 検証/デバッグ用途で (Developer Edition) 他ストレージとの 同期用途で
おまけ - SQL Azure では CDC, Change Tracking ともに未サポート http://msdn.microsoft.com/en-us/library/ee336237.aspx http://msdn.microsoft.com/en-us/library/ee336253.aspx SQL Azure Data Sync or Sync Framework で オンプレミスの SQL Server と同期すれば… ->同期を実行したタイミングでしかオンプレミスの SQL Server にデータが反映されないので、全ての履歴を残す事は出来ない。

Weitere ähnliche Inhalte

Andere mochten auch

Management studio の便利機能の紹介
Management studio の便利機能の紹介Management studio の便利機能の紹介
Management studio の便利機能の紹介Oda Shinsuke
 
Selenium 触ってみよう
Selenium 触ってみようSelenium 触ってみよう
Selenium 触ってみようOda Shinsuke
 
SciVerse ScienceDirect training 201103
SciVerse ScienceDirect training 201103SciVerse ScienceDirect training 201103
SciVerse ScienceDirect training 201103tsuneyoshi
 
Zespol nadkobiety parys andrzej
Zespol nadkobiety parys andrzejZespol nadkobiety parys andrzej
Zespol nadkobiety parys andrzejAndrzej Parys
 
Aanbod kantoorobjecten Apeldoorn (test)
Aanbod kantoorobjecten Apeldoorn (test)Aanbod kantoorobjecten Apeldoorn (test)
Aanbod kantoorobjecten Apeldoorn (test)Richard_vanbeek
 
ตัวอย่างบทที่2โปรแกรม filter บน linux
ตัวอย่างบทที่2โปรแกรม filter บน linuxตัวอย่างบทที่2โปรแกรม filter บน linux
ตัวอย่างบทที่2โปรแกรม filter บน linuxrubtumproject.com
 
Hanny Kusumawati - Pecha Kucha JKT x PR Vaganza
Hanny Kusumawati - Pecha Kucha JKT x PR VaganzaHanny Kusumawati - Pecha Kucha JKT x PR Vaganza
Hanny Kusumawati - Pecha Kucha JKT x PR Vaganzapechakuchajakarta
 

Andere mochten auch (15)

Management studio の便利機能の紹介
Management studio の便利機能の紹介Management studio の便利機能の紹介
Management studio の便利機能の紹介
 
Selenium 触ってみよう
Selenium 触ってみようSelenium 触ってみよう
Selenium 触ってみよう
 
SciVerse ScienceDirect training 201103
SciVerse ScienceDirect training 201103SciVerse ScienceDirect training 201103
SciVerse ScienceDirect training 201103
 
Zespol nadkobiety parys andrzej
Zespol nadkobiety parys andrzejZespol nadkobiety parys andrzej
Zespol nadkobiety parys andrzej
 
Aanbod kantoorobjecten Apeldoorn (test)
Aanbod kantoorobjecten Apeldoorn (test)Aanbod kantoorobjecten Apeldoorn (test)
Aanbod kantoorobjecten Apeldoorn (test)
 
ตัวอย่างบทที่2โปรแกรม filter บน linux
ตัวอย่างบทที่2โปรแกรม filter บน linuxตัวอย่างบทที่2โปรแกรม filter บน linux
ตัวอย่างบทที่2โปรแกรม filter บน linux
 
Alohos meniu 2011
Alohos meniu 2011Alohos meniu 2011
Alohos meniu 2011
 
Ekonomi bandung-seminar
Ekonomi bandung-seminarEkonomi bandung-seminar
Ekonomi bandung-seminar
 
Hanny Kusumawati - Pecha Kucha JKT x PR Vaganza
Hanny Kusumawati - Pecha Kucha JKT x PR VaganzaHanny Kusumawati - Pecha Kucha JKT x PR Vaganza
Hanny Kusumawati - Pecha Kucha JKT x PR Vaganza
 
Révision et fin unité 6
Révision et fin unité 6Révision et fin unité 6
Révision et fin unité 6
 
Unité 4 début
Unité 4 débutUnité 4 début
Unité 4 début
 
Canindé
CanindéCanindé
Canindé
 
Bilan argentine
Bilan argentineBilan argentine
Bilan argentine
 
Le passé composé
Le passé composéLe passé composé
Le passé composé
 
Salient poles
Salient polesSalient poles
Salient poles
 

Mehr von Oda Shinsuke

SQL Server2022_PSPoptimization_pub.pdf
SQL Server2022_PSPoptimization_pub.pdfSQL Server2022_PSPoptimization_pub.pdf
SQL Server2022_PSPoptimization_pub.pdfOda Shinsuke
 
Dot net+sql server tips
Dot net+sql server tipsDot net+sql server tips
Dot net+sql server tipsOda Shinsuke
 
Sql server 2019 ざっくり紹介
Sql server 2019  ざっくり紹介Sql server 2019  ざっくり紹介
Sql server 2019 ざっくり紹介Oda Shinsuke
 
Spark on sql server?
Spark on sql server?Spark on sql server?
Spark on sql server?Oda Shinsuke
 
SQL Server のロック概要
SQL Server のロック概要SQL Server のロック概要
SQL Server のロック概要Oda Shinsuke
 
Blazor 触ってみた
Blazor 触ってみたBlazor 触ってみた
Blazor 触ってみたOda Shinsuke
 
Linux + PHP でも SQL Server
Linux + PHP でも SQL ServerLinux + PHP でも SQL Server
Linux + PHP でも SQL ServerOda Shinsuke
 
グラフデータベースの話し
グラフデータベースの話しグラフデータベースの話し
グラフデータベースの話しOda Shinsuke
 
Sql server 2017 新機能のご紹介
Sql server 2017 新機能のご紹介Sql server 2017 新機能のご紹介
Sql server 2017 新機能のご紹介Oda Shinsuke
 
Sql server 2017 からはじめる graph データベース
Sql server 2017 からはじめる graph データベースSql server 2017 からはじめる graph データベース
Sql server 2017 からはじめる graph データベースOda Shinsuke
 
Transaction scopeまだダメ
Transaction scopeまだダメTransaction scopeまだダメ
Transaction scopeまだダメOda Shinsuke
 
Sql serverと他dbの違いを押さえよう!
Sql serverと他dbの違いを押さえよう!Sql serverと他dbの違いを押さえよう!
Sql serverと他dbの違いを押さえよう!Oda Shinsuke
 
2016年を振り返って
2016年を振り返って2016年を振り返って
2016年を振り返ってOda Shinsuke
 
開発者の方向けの Sql server(db) t sql 振り返り
開発者の方向けの Sql server(db) t sql 振り返り開発者の方向けの Sql server(db) t sql 振り返り
開発者の方向けの Sql server(db) t sql 振り返りOda Shinsuke
 
Ms build 触ってみよう
Ms build 触ってみようMs build 触ってみよう
Ms build 触ってみようOda Shinsuke
 
Sql server2014復習とsqlserver2016の紹介
Sql server2014復習とsqlserver2016の紹介Sql server2014復習とsqlserver2016の紹介
Sql server2014復習とsqlserver2016の紹介Oda Shinsuke
 
Sql server sql database 最新機能紹介
Sql server sql database 最新機能紹介Sql server sql database 最新機能紹介
Sql server sql database 最新機能紹介Oda Shinsuke
 
Sql database のご紹介
Sql database のご紹介Sql database のご紹介
Sql database のご紹介Oda Shinsuke
 

Mehr von Oda Shinsuke (20)

SQL Server2022_PSPoptimization_pub.pdf
SQL Server2022_PSPoptimization_pub.pdfSQL Server2022_PSPoptimization_pub.pdf
SQL Server2022_PSPoptimization_pub.pdf
 
What's hyperscale
What's hyperscaleWhat's hyperscale
What's hyperscale
 
Dot net+sql server tips
Dot net+sql server tipsDot net+sql server tips
Dot net+sql server tips
 
Sql server 2019 ざっくり紹介
Sql server 2019  ざっくり紹介Sql server 2019  ざっくり紹介
Sql server 2019 ざっくり紹介
 
Spark on sql server?
Spark on sql server?Spark on sql server?
Spark on sql server?
 
SQL Server のロック概要
SQL Server のロック概要SQL Server のロック概要
SQL Server のロック概要
 
Blazor 触ってみた
Blazor 触ってみたBlazor 触ってみた
Blazor 触ってみた
 
Linux + PHP でも SQL Server
Linux + PHP でも SQL ServerLinux + PHP でも SQL Server
Linux + PHP でも SQL Server
 
グラフデータベースの話し
グラフデータベースの話しグラフデータベースの話し
グラフデータベースの話し
 
Sql server 2017 新機能のご紹介
Sql server 2017 新機能のご紹介Sql server 2017 新機能のご紹介
Sql server 2017 新機能のご紹介
 
Sql server 2017 からはじめる graph データベース
Sql server 2017 からはじめる graph データベースSql server 2017 からはじめる graph データベース
Sql server 2017 からはじめる graph データベース
 
Transaction scopeまだダメ
Transaction scopeまだダメTransaction scopeまだダメ
Transaction scopeまだダメ
 
Sql serverと他dbの違いを押さえよう!
Sql serverと他dbの違いを押さえよう!Sql serverと他dbの違いを押さえよう!
Sql serverと他dbの違いを押さえよう!
 
2016年を振り返って
2016年を振り返って2016年を振り返って
2016年を振り返って
 
Sql world とは
Sql world とはSql world とは
Sql world とは
 
開発者の方向けの Sql server(db) t sql 振り返り
開発者の方向けの Sql server(db) t sql 振り返り開発者の方向けの Sql server(db) t sql 振り返り
開発者の方向けの Sql server(db) t sql 振り返り
 
Ms build 触ってみよう
Ms build 触ってみようMs build 触ってみよう
Ms build 触ってみよう
 
Sql server2014復習とsqlserver2016の紹介
Sql server2014復習とsqlserver2016の紹介Sql server2014復習とsqlserver2016の紹介
Sql server2014復習とsqlserver2016の紹介
 
Sql server sql database 最新機能紹介
Sql server sql database 最新機能紹介Sql server sql database 最新機能紹介
Sql server sql database 最新機能紹介
 
Sql database のご紹介
Sql database のご紹介Sql database のご紹介
Sql database のご紹介
 

データを追っかけよう!

  • 1. データを追っかけよう! ~変更データキャプチャ と 変更の追跡 を使ってみた~ 2011/01/29 お だ
  • 3. データの変更って? DML(Data Manipulation Language)の変更を追跡する 追加操作 (INSERT) 変更操作 (UPDATE) 削除操作 (DELETE) ※検索(SELECT) は含まない! そもそも DML ってデータの参照は含まない? SQL Server 2008R2 では http://msdn.microsoft.com/ja-jp/library/ff848766.aspx SQL Server Comapctでは http://msdn.microsoft.com/ja-jp/library/ms174439(v=SQL.100).aspx
  • 4. 変更を確認するには データ変更キャプチャ (Change Data Capture) 変更の追跡 (Change Tracking) SQL Server 2008 から追加された それ以前は・・・トリガー等で実装?
  • 5.
  • 6.
  • 7. 変更履歴を保持しないと… 差分比較しか出来ない。 起点となるデータ(前回のスナップショット等)から現在のデータに対しての比較しか出来ない。 一トランザクション内での同一データへの複数回更新はハンドリング出来ない。 トランザクション終了時点で、開始前と比べてどうなったか?しか保持していない。例:UPDATE後に DELETE した場合は、DELETE 扱い データサイズが少なくて済む。
  • 8. CDC を使ってみる 0. SQL Server Agentを起動する SQL Server Agent が起動していないと、変更データが書き込まれない。 http://msdn.microsoft.com/ja-jp/library/bb522475.aspx 1.データベース で CDC を有効にする システムテーブルやスキーマー、ユーザーに色々と追加される。 テンプレート:Change Data Capture - Configuration - Enable Database for CDC を参考に EXEC sys.sp_cdc_enable_db GO
  • 9. CDC を使ってみる 2.Capture するテーブルを指定 キャプチャインスタンス名を省略時には、 「スキーマ名_テーブル名」で付けられる。 システムテーブルに、履歴用のテーブルが追加される。 テンプレート:Change Data Capture - Configuration - Enable a Table Naming the Capture Instance を参考に EXEC sys.sp_cdc_enable_table @source_schema = N‘スキーマ名', @source_name = N‘テーブル名', @role_name = NULL, -- GatingRole?を使う場合指定する? @capture_instance = N‘何か一意な名前‘ -- 省略可能
  • 10. デモ Agent が起動している状態で INSERT 発行。CDC テーブルにも反映される。 Agent を止めた状態で INSERT を発行。CDC テーブルに反映されない。 Agent を起動すると、さっき INSERT したデータが反映される。 トランザクション内で同一のデータを複数回更新する。
  • 11. テーブル定義を変更すると… 新しく追加された列(キャプチャ対象として指定されていない列)は無視される キャプチャ対象列が削除されたら? ->履歴データは、以降 NULL が設定される cdc.ddl_historyテーブルに定義が変わった事が書き込まれる ->sys.sp_cdc_get_ddl_historyストアドを使うと、内容を確認出来る。 ->自動では通知してくれなさそう。定期的に監視する必要がある。(今回は開発補助として使うので無問題)
  • 12. テーブル定義を変更すると… キャプチャインスタンスは、1テーブルに対し最大 2 個まで関連付けることが出来る。 定義を変更したら再度別名でキャプチャインスタンスを作成し、 旧キャプチャインスタンスのデータを移行(INSERT~SELECT)して、削除することで定義の変更にも対応?!
  • 13. デモ 新しく列を追加後に、更新処理を行う キャプチャ対象の列を削除し、更新処理を行う キャプチャインスタンスをもう一つ作成し、更新処理を行う。 キャプチャインスタンスのデータ移行(旧 -> 新)
  • 14. CDC を使ってみる 3.キャプチャインスタンスの削除 @capture_instanceに ‘all’ を指定した場合は、テーブルに紐付く全てのキャプチャインスタンスが削除される。 システムテーブルに、履歴用のテーブルが削除される。 テンプレート:Change Data Capture - Configuration - Disable a Capture Instance for a Table を参考に EXEC sys.sp_cdc_disable_table @source_schema = N'スキーマ名', @source_name = N‘テーブル名', @capture_instance = N‘キャプチャインスタンス名 又は all' GO
  • 15. CDC を使ってみる 3.データベース で CDC を無効にする キャプチャインスタンスが存在してても、無効に出来る。 履歴用のテーブル等も全削除される。 システムテーブルやスキーマー、ユーザーに色々と追加されたのが削除される。 テンプレート:Change Data Capture - Configuration - Disable Database for CDC を参考に EXEC sys.sp_cdc_disable_db GO
  • 16. CDC をちゃんと使いたい… ある期間で変更されたデータを取得する 履歴データの管理(破棄やローテーション) 列の型は何対応してるの? ミラーリング/レプリケーションとか? http://msdn.microsoft.com/ja-jp/library/cc645938.aspx を参考に!
  • 17. Change Tracking を使ってみる 1.データベースで Tracking を有効化 CHANGE_RENTENTION:数値 単位(DAYS,HOUR,MINUTES) AUTO_CLEANUP:ON,OFF テンプレート:Change Tracking - Set Change Tracking on Database を参考に ALTER DATABASE データベース名SET CHANGE_TRACKING = ON ( CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON ) GO SSMS から GUI で設定可能!
  • 18. Change Tracking を使ってみる 1’.SSMS を使って GUI で設定する
  • 19. Change Tracking を使ってみる 2.テーブルで Tracking を有効化 TRACK_COLUMNS_UPDATED:ON,OFF 変更した列も記録出来るが使いにくいので、OFF推奨! テンプレート:Change Tracking - Enable Change Tracking on Table を参考に ALTER TABLE スキーマ名.テーブル名 ENABLE CHANGE_TRACKING WITH ( TRACK_COLUMNS_UPDATED = OFF ) GO SSMS から GUI で設定可能!
  • 20. Change Tracking を使ってみる 2’.SSMS を使って GUI で設定する
  • 21. Change Tracking を使ってみる 3.変更を確認する @version は、どの時点からの変更分を確認する。 初回は、最小のバージョン番号を指定する。 SELECT * FROM CHANGETABLE ( CHANGES [テーブル名], @version ) AS c CHANGE_TRACKING_MIN_VALID_VERSION( OBJECT_ID(‘スキーマ名.テーブル名') )
  • 22. Change Tracking を使ってみる 4.変更された列の確認は? Bit マスクで変更されたか確認している! しかも 1列ずつしか出来ない! DECLARE @changeColumnvarbinary(4100) SELECT @changeColumn = c.SYS_CHANGE_COLUMNS FROM CHANGETABLE ( CHANGES [テーブル名], バージョン番号) AS c WHERE ~ SELECT CHANGE_TRACKING_IS_COLUMN_IN_MASK ( COLUMNPROPERTY( OBJECT_ID(‘スキーマ名.テーブル名’), ‘カラム名', 'ColumnId‘ ) ,@changeColumn-- NULL だと、変更した扱いになる。使えね… )
  • 23. Change Tracking を使ってみる 5.変更時にマークをつけることが可能 更新時に VARBINARY で設定し、SYS_CHANGE_CONTEXTから CAST して取り出す。 DECLARE @originator_idVARBINARY(128); SET @originator_id = CAST(N'アプリで追加' AS VARBINARY(128)); WITH CHANGE_TRACKING_CONTEXT ( @originator_id ) INSERT INTO ~ SELECT * , CAST(SYS_CHANGE_CONTEXT AS NVARCHAR) FROM CHANGETABLE ( CHANGES [テーブル名], @version ) AS c
  • 25. Change Tracking を使ってみる 6.テーブルで Tracking を無効化 SSMS から GUI で設定可能。 テンプレート:Change Tracking - Disable Change Tracking on Table を参考に ALTER TABLE スキーマ名.テーブル名 DISABLE CHANGE_TRACKING GO
  • 26. Change Tracking を使ってみる 7.データベースで Tracking を無効化 全てのテーブルの Tracking を無効にしていないと、エラーになる。 テンプレート:Change Tracking - Set Change Tracking on Database を参考に ALTER DATABASE データベース名SET CHANGE_TRACKING = OFF GO
  • 27. まとめ 変更データキャプチャ Enterprise Edition のみ 履歴も保持する テンプレートが充実 変更の追跡 Express Edition でもOK 履歴は保持しない テンプレートが少ない 検証/デバッグ用途で (Developer Edition) 他ストレージとの 同期用途で
  • 28. おまけ - SQL Azure では CDC, Change Tracking ともに未サポート http://msdn.microsoft.com/en-us/library/ee336237.aspx http://msdn.microsoft.com/en-us/library/ee336253.aspx SQL Azure Data Sync or Sync Framework で オンプレミスの SQL Server と同期すれば… ->同期を実行したタイミングでしかオンプレミスの SQL Server にデータが反映されないので、全ての履歴を残す事は出来ない。