
(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.