私たちが知る限り、SQL Server でテーブルに変更が加えられたかどうかを検出する唯一の方法は、動的管理ビュー sys.dm_db_index_usage_stats ( http://msdn.microsoft.com/en ) を使用することです。 -us/library/ms188755.aspx )。
私の目的のために、情報へのアクセスを容易にする関数を作成しました。
create function [dbo].[_efnLastTableUpdateTime](@TableName varchar(255))
/* Function to return the last datetime that a table was modified.
Note that because this is from a dynamic management view, it is only
since the server was started, i.e. will return null if no change since
the server was started.
SQL2005 or later.
*/
returns datetime
as
begin
declare @Result datetime
set @Result = (
select top 1 [last_user_update]
from sys.dm_db_index_usage_stats
where object_id=object_id(@TableName)
order by [last_user_update] desc
)
return @Result
end
GO
次に、TADOQuery の子孫に、TADOQuery にアクセスする関数と、機能のオンとオフを切り替えるプロパティを組み込みました。その後、これをオンデマンドで呼び出すことができるため、非常に効率的な応答が得られます。
function TMyADOQuery.HasBeenUpdatedSinceOpen(const ACloseIfHasBeen: boolean = false): boolean;
const
sSelectTableUpdateTime = 'select [dbo]._efnLastTableUpdateTime(''%s'')';
var
NewUpdateTime: TDateTime;
begin
Result := false;
if(_TrackUpdated) and (Active) and (_TableName > '') then begin
NewUpdateTime := TrackUpdateQuery.SelectScalarDate(Format(sSelectTableUpdateTime, [_TableName]), 0);
Result := (FLastUpdateTime <> NewUpdateTime);
FLastUpdateTime := NewUpdateTime;
end;
if(Result) and (ACloseIfHasBeen) then
Close;
end;
TrackUpdateQuery
内部で作成された TADOQuery の別のインスタンスでありSelectScalarDate
、私の TADOQuery クラスの拡張です。
ユーザーが管理ビューにアクセスできるようにするには、 VIEW SERVER STATE権限が付与されている必要があることに注意してください。