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