Marquer une procédure stockée en mode système (sp_MS_MarkSystemObject)

Logo

Introduction

Dans des tâches de maintenance ou d’administration, il est parfois nécessaire de disposer d’une procédure stockée qui puisse être appelée depuis n’importe quelle base tout en conservant le contexte d’exécution, c’est à dire la base de données courante dans laquelle la procédure stockée est exécutée.

Cet article montre comment avoir une tel comportement pour une procédure stockée avec la procédure système sp_MS_MarkSystemObject.

Contexte

Dans le contexte du problème qui se pose, la procédure stockée sp__dba_getobjects permet d’obtenir la localisation des objets sur les filegroups, ainsi que leurs types (table, index non clustered, index clustered ou index texte) pour une base de données.

Exemple :

use cgcam
go
execute sp__dba_getobjects
go
          
name                    type                    objectname              groupname
--------------------    ---------------------   ---------------------   ------------
T_CGC_HISTO             TABLE                   T_CGC_HISTO             HISTO
tT_CGC_HISTO            TEXTINDEX               T_CGC_HISTO             HISTO
T_CGCAM_HISTO           TABLE                   T_CGCAM_HISTO           HISTO
IDX_T_CGC_HISTO         NONCLUSTERED INDEX      T_CGC_HISTO             HISTO_INDX
IDXC_T_CGCAM_HISTO      NONCLUSTERED INDEX      T_CGCAM_HISTO           HISTO_INDX
IDX_T_CGC               NONCLUSTERED INDEX      T_CGC                   INDX
IDXC_T_CGCAM            NONCLUSTERED INDEX      T_CGCAM                 INDX
T_CGC                   TABLE                   T_CGC                   PRIMARY
tT_CGC                  TEXTINDEX               T_CGC                   PRIMARY
T_CGC_BLOB              TABLE                   T_CGC_BLOB              PRIMARY
T_CGCAM                 TABLE                   T_CGCAM                 PRIMARY

Procédure sp_MS_MarkSystemObject

Il est nécessaire de pouvoir exécuter la procédure sp__dba_getobjects depuis n’importe quelle base sans avoir à recréer cette procédure stockée dans chacune des bases de données utilisateur. Pour cela, la procédure stockée sp__dba_getobjects doit être créée dans la base master et marquée comme étant une procédure stockée système avec la procédure stockée sp_MS_MarkSystemObject.

Syntaxe :

execute sp_MS_MarkSystemObject '<procedure_name>'
use master
go
/** creation de la procédure stockée sp__dba_getobjects */
go
execute sp_MS_MarkSystemObject 'sp__dba_getobjects'
go