インデックスの作成日とか、更新日とか取得してみる
今回やることを説明してみる
最近、出張が多く記事を書く暇が中々とれないので、JAL Sky Wifi とかで移動中に書いてしまうことが多いです。
ただ、JAL Sky Wifi は通信が非常に遅いので、画像とかアップするには結構つらい感じです....もう少し通信速度アップしてくれないかなぁ...ryuchan.hatenablog.com
さて、今回は SQL Server で ALTER INDEX などをした場合に、更新日などを取得する方法です。非クラスター化インデックスの更新日とか取得できないです。いままで、sys.objects から取得できると勘違いしていました。
使用する環境を説明してみる
最近、パワーアップした Lenovo を使用します。環境は、Windows 10,SQL Server 2016 CTP2.3 です。データベースは、Adventureworks を使用します。ryuchan.hatenablog.com
CTP 3.0 にはまだしてません...
CTP 3.0 リリースされましたね。
https://t.co/Uoh2FTYQvy
— Masayuki Ozawa (@Masayuki_Ozawa) 2015, 10月 30
早速試してみる
インデックスの生成、更新、削除は、トレースから取得することが可能です。SQL Server Profiler で取得してみましょう。Objects イベントを設定し、トレースを実行します。
- Object:Altered イベント クラス
Object:Altered イベント クラスは、ALTER INDEX、ALTER TABLE、ALTER DATABASE などのステートメントによって、オブジェクトが変更されたことを示します。このイベント クラスは、たとえば、頻繁に一時ストアド プロシージャを作成する ODBC アプリケーションによって、オブジェクトが変更されているかどうかを判断するために使用できます。
Object:Altered イベント クラスは常に 2 つのイベントとして発生します。最初のイベントは開始フェーズを示します。2 番目のイベントはロールバック フェーズまたはコミット フェーズを示します。- Object:Created イベント クラス
Object:Created イベント クラスは、CREATE INDEX、CREATE TABLE、CREATE DATABASE などのステートメントによって、オブジェクトが作成されたことを示します。
このイベント クラスは、たとえば、頻繁に一時ストアド プロシージャを作成する ODBC アプリケーションによって、オブジェクトが作成されているかどうかを判断するために使用できます。 LoginName データ列と NTUserName データ列を監視することで、オブジェクトを作成、削除、またはアクセスしたユーザーの名前を特定できます。- Object:Deleted イベント クラス
Object:Deleted イベント クラスは、DROP INDEX ステートメントや DROP TABLE ステートメントなどによって、オブジェクトが削除されたことを示します。たとえば、頻繁に一時ストアド プロシージャを作成する ODBC アプリケーションによって、オブジェクトが削除されているかどうかを判断するために使用できます。
Objects イベント クラスに加えて、既定の LoginName データ列と NTUserName データ列を監視することで、オブジェクトを作成、削除、またはアクセスしたユーザーの名前を特定できます。LoginName データ列と NTUserName データ列を監視することで、オブジェクトを作成、削除、または変更したユーザーの名前を特定できます。
SQL Server Management Studio で下記の ALTER 文を実行します。
USE AdventureWorks2012 GO CREATE NONCLUSTERED INDEX [IX_SalesOrderDetail_ProductID] ON [Sales].[SalesOrderDetail] ( [ProductID] ASC ) INCLUDE ( [SalesOrderID], [SalesOrderDetailID], [CarrierTrackingNumber]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = ON, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, DATA_COMPRESSION = PAGE) ON [PRIMARY] GO
SQL Server Profiler に下記の通り出力されます。
下図の通り、X_SalesOrderDetail_ProductID に対して、2015-11-01 17:07:21.567 に変更が開始され、2015-11-01 17:07:21.570 にコミットされたことが判断できます。
おわりになにか言ってみる
トレースから取得できても、何かしら作りこまないと業務上使えませんね。(あ、これ個人的意見なので。)インデックスの作成日、更新日とかもってくれないかなぁ。あと、変更履歴とか。ニーズないのかな?