Mit dem Einsatz von BI Lösungen haben Viele den Wunsch möglichst immer die aktuellsten Daten aus Ihrem Quellsystem zu analysieren. Doch wie erkennt man, welche Tabellen aktualisiert wurden, möglichst zeitnah nachdem das Update vorgenommen wurde? Am besten automatisiert? Alles machbar!
In diesem Blogbeitrag soll kurz beschrieben werden wie man automatisiert Daten, die in Tabellen in einer MS SQL Server Datenbank geändert wurden erkennt und diese ohne das Eingreifen eines Anwenders in den Cube laden kann.
In vielen Fällen wird die Datenverarbeitung der Quelldaten bis hin zum Cube nächtlich über einen Server Agent Job initiiert.
Nutzen Sie jetzt allerdings eine Applikation mit der Sie beispielsweise Daten manuell in einer SQL Server Datenbanktabelle erfassen, die Sie später in Ihrem Cube sehen wollen, so würden diese auch nur im nächtlichen Ladeprozess verarbeitet werden.
Zur Überwachung von Tabellen können Sie folgende Systemview nutzen sys.dm_db_index_usage_stats. Würde ein User ein INSERT, UPDATE oder DELETE auf eine Tabelle ausführen so hat man die Möglichkeit über die View auszuwerten. Last_User_Update gibt einen Timestamp zurück wann das letzte Update durch einen User erfolgt ist und User_Updates gibt an wie viele Updates durchgeführt wurden.
SELECT TableName = OBJECT_NAME(OBJECT_ID) ,Last_User_Update ,User_Updates FROM sys.dm_db_index_usage_stats WHERE database_id = DB_ID('MyDatabase')
Das Ergebnis kann dann wie folgt aussehen
Dieses Statement kann jetzt beispielsweise in einem SQL Server Agent Job verwendet werden, der aller 30 Minuten ausgeführt wird. Wenn es dann in den letzten 30 Minuten zu Änderungen in den Tabellen kam kann ein weiterer Job aufgerufen werden die diese Daten weiter verarbeitet. Das entsprechende T-SQL-Statement kann dann wie folgt aussehen:
DECLARE @Count int = 0; WITH Liste as ( SELECT TableName = OBJECT_NAME(OBJECT_ID) ,Last_User_Update FROM sys.dm_db_index_usage_stats WHERE database_id = DB_ID('MyDatabase') AND Last_User_Update > DATEADD(minute, -30, getdate()) ) Select @Count = Count(*) from Liste IF @count >0 BEGIN use msdb; EXEC dbo.sp_start_job 'MyJob'; END
Vielen vielen Dank für diese Info! – Es ist genau das, was ich gebraucht habe!
Und dass ohne den aufgeblasenen CDC (Change Data Capture) Kram.
Alleine der Name erinnert schon an den Amerikanischen Seuchenschutz.
Nochmals vielen Dank.