Il peut être intéressant de pouvoir utiliser une procédure stockée dans n’importe quel contexte de base de données (sur la même instance SQL Server).
Voyons comment faire cela à l’aide de la procédure stockée système non documentée sp_MS_marksystemobject
Je cherchai à fournir à mes collègues développeurs SQL un moyen de générer des instructions CRUD (INSERT, SELECT, UPDATE, DELETE) de façon propre et générique.
Voici donc l’exemple de l’INSERT (je publierai les autres dans un billet à venir) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | USE master GO CREATE PROCEDURE dbo.sp__generate_INSERT @_table_name sysname, @_nb_tab tinyint = 0 AS BEGIN SET NOCOUNT ON DECLARE @sql varchar(max) SELECT @sql = CASE WHEN @sql IS NULL THEN REPLICATE(CHAR(9), @_nb_tab) + 'INSERT' + CHAR(9) + @_table_name + CHAR(13) + CHAR(10) + REPLICATE(CHAR(9), @_nb_tab) + '(' + CHAR(13) + CHAR(10) + REPLICATE(CHAR(9), @_nb_tab) + CHAR(9) + name ELSE @sql + CHAR(13) + CHAR(10) + REPLICATE(CHAR(9), @_nb_tab) + CHAR(9) + ', ' + name END FROM sys.columns WHERE object_id = OBJECT_ID(@_table_name) AND is_computed = 0 ORDER BY column_id SET @sql = @sql + CHAR(13) + CHAR(10) + REPLICATE(CHAR(9), @_nb_tab) + ')' PRINT @sql END |
Vous remarquerez que je me place dans le contexte de la base de données système master, qui est la seule dans laquelle vous pouvez marquer des procédures stockées comme objet système.
Un autre requis pour pouvoir utiliser une procédure stockée marquée comme objet système dans n’importe quel contexte de base de données de l’instance en cours, est de faire commencer le nom de la procédure stockée par « sp ».
Rien ne vous empêche de marquer la procédure stockée comme objet système, mais lorsque vous exécuterez une telle procédure stockée (dont le nom ne commence donc pas par « sp »), SQL Server « feindra » de ne pas trouver celle-ci.
Le marquage se fait de façon extrêmement simple, mais n’est pas documenté :
EXEC sp_MS_marksystemobject 'sp__generate_INSERT'
Et le tour est joué : vous pouvez générer le script d’INSERT en exécutant tout simplement :
1 2 3 4 | USE maBD GO EXEC sp__generate_INSERT 'maTable' |
Bonne génération !
ElSüket
Je déterre un vieux post, mais… Connaissez-vous la procédure inverse à sp_MS_marksystemobject ?
(enlever le marquage système)
Merci SQLPro, voilà qui est corrigé
Deux petites choses :
1) t’es aussi dyslexique que moi, et dans ton titre tu a oublié le e final de « un » procédure !
2) c’est pas sp_ms_marksystemobject, mais sys.sp_MS_marksystemobject (note la casse).
J’ai fait une entrée de mon blog sur le sujet : http://blog.developpez.com/sqlpro/p10131/ms-sql-server/creer-une-procedure-executable-de-toutes/
A +
Pour les droits je dirais qu’il faut être sysadmin, mais je ne peux pas le vérifier sur le champ
Une telle procédure stockée ne peut être que dans la base de données master
Enfin en ce qui concerne le nom de la procédure, il est recommandé de ne pas les nommer comme tu le suggeres, pour cette raison justement
Intéressant
Quel droit minimum doit avoir l’application (ou l’utilisateur) qui exécute ce genre de procédure stockée ?
Par ailleurs, le fait que cette procédure agisse au niveau instance présente à la fois des avantages et des inconvénients.
Par exemple lors des Backup/Restore d’une base utilisateur sur une autre instance il faudrait être attentif au fait que la procédure stockée (sp__generate_INSERT) n’est pas incluse dans la base restaurée.
Aussi la contrainte de nommage (sp…..) ne facilite pas beaucoup la vie ! ça peut être source de confusion entre les procédures systèmes natives et celles crées par l’utilisateurs (Développeur, DBA,…)
A+