
(c) photo jeanclaudedelafarge.fr
Un post rapide pour partager un script T-SQL qui me sert à connaitre les ressources lockées par un processus dans SQL Server. La version old school est l’utilisation de la procédure stockée système sp_lock.
Le problème, c’est qu’on ne peut pas faire de jointures avec d’autres tables systèmes, ni mettre de clause WHERE. Heureusement, il y a les DMV qui nous ramène la même chose, de façon un peu plus utilisable.
select request_mode, request_type, request_status, resource_type, resource_subtype, db_name(resource_database_id) as dbname, case when resource_type = 'OBJECT' then object_name(resource_associated_entity_id) when resource_type in ('KEY', 'PAGE', 'HOBT') then ( select object_name(partitions.object_id) + '.'+isnull(i.name, 'HEAP') from sys.partitions inner join sys.indexes i on i.object_id = partitions.object_id and i.index_id = partitions.index_id where hobt_id = resource_associated_entity_id) ----> marche uniquement dans le contexte de la base concernée when resource_type in ('ALLOCATION_UNIT') then ( select isnull(t.name, '--') + '.'+ isnull(i.name, 'HEAP') from sys.allocation_units au with (nolock) left join sys.partitions p with (nolock) on au.container_id = p.hobt_id left join sys.indexes i with (nolock) on i.object_id = p.object_id and i.index_id = p.index_id left join sys.tables t with (nolock) on t.object_id = i.object_id where allocation_unit_id = resource_associated_entity_id ) ----> marche uniquement dans le contexte de la base concernée else cast(resource_associated_entity_id as sysname) end as resource_name, resource_description, session_id, original_login_name, last_request_start_time, login_time from sys.dm_tran_locks left join sys.dm_exec_sessions on dm_tran_locks.request_session_id = dm_exec_sessions.session_id where dm_exec_sessions.session_id <> @@SPID
Vous n’avez plus qu’à ajouter les clauses where qui vont bien pour identifier vos locks. Le CASE WHEN est à améliorer, je l’ai fait à l’arrache pour mon besoin du jour.