Version DMV de sp_lock

paris-cadenas-amoureux-pont-des-arts-jcl

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

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s