Come posso conoscere la data e l’ora dell’ultimo UPDATE eseguito su una tabella da parte di un utente ?
Una delle DMVs (Index Related Dynamic Management Views and Functions), disponibili dalla versione 2005 di SQL Server, ci permette di rispondere a questa domanda.
Possiamo infatti utilizzare la DMV sys.dm_db_index_usage_stats che con i sui differenti contatori, basati sulle operazioni eseguite sugli indici, ci permette di conoscere, ad esempio, la data e l’ora dell’ultimo comando UPDATE eseguito su una determinata tabella.
La seguente funzione inline (basata su sys.dm_db_index_usage_stats) accetta in input un parametro di tipo VARCHAR in cui è possibile specificare il nome di una tabella oppure una lista di nomi di tabelle separati da “,” per le quali di desidera conoscere la data/ora dell’ultimo user UPDATE eseguito. Le informazioni richieste verranno restituire sotto forma di tabella.
USE [AdventureWorks] go
— Create inline user-defined functions
CREATE FUNCTION dbo.udf_get_update_counter
(@object_name AS varchar(max))
RETURNS TABLE
AS
/*
Descrizione:
La funzione restituisce la data e l’ora
dell’ultimo comando UPDATE eseguito su una
determinata tabella
Parametri:
@object_name = Nome di una tabella o lista di nomi di tabelle
separati da "," per le quali di desidera
conoscere la data/ora dell’ultimo UPDATE eseguito
*/
RETURN
(
SELECT
object_schema_name(d.object_id) AS object_schema_name,
object_name(d.object_id) AS object_name,
MAX(d.last_user_update) AS last_user_update,
MAX(d.last_system_update) AS last_system_update
FROM
sys.dm_db_index_usage_stats d
JOIN
sys.objects o ON o.object_id=d.object_id
WHERE
((d.user_updates > 0) OR
(d.last_system_update > 0)) AND
((CHARINDEX((‘,’ + LTRIM(RTRIM(object_schema_name(d.object_id) + ‘.’ + o.name)) + ‘,’),
(‘,’ + REPLACE(@object_name, ‘ ‘, ”) + ‘,’)) > 0) OR
(@object_name=”))
GROUP BY
d.object_id
)
Esempio:
Aggiorniamo nell’ordine le tabelle Production.Product e Person.Address presenti nel database AdventureWorks, in cui abbiamo creato la funzione dbo.udf_get_update_counter:
–1
update
production.product
set
ListPrice=(ListPrice + 1)
where
ProductId=1
go
–2
update
Person.Address
set
City=City
where
AddressID=1
Utilizziamo la funzione dbo.udf_get_update_counter a cui passiamo (come parametro) i nomi delle tabelle per le quali si desidera conoscere la data/ora dell’ultimo UPDATE eseguito:
*
from
dbo.udf_get_update_counter(‘Production.Product, Person.Address’)
order by
last_user_update desc
I contatori vengono inizializzati ad ogni:
-
Avvio del servizio SQL Server (MSSQLSERVER)
-
Detach del database
- Shut down (per esempio, perché AUTO_CLOSE è impostato su ON)