142 votes

Comment détecter si une procédure stockée existe déjà

Je dois écrire un script de déploiement qui fonctionnera si une procédure stockée existe ou n'existe pas. c'est-à-dire que s'il existe, je dois le modifier, sinon le créer.

Comment puis-je faire cela dans le SQL.

J'utilise SQL Server 2005

165voto

Andomar Points 115404

Si vous abandonnez et créez la procédure, vous perdrez les paramètres de sécurité. Cela pourrait gêner votre administrateur de base de données ou casser votre application.

Ce que je fais est de créer une procédure stockée triviale si elle n'existe pas encore. Après cela, vous pouvez modifier la procédure stockée à votre convenance.

 IF object_id('YourSp') IS NULL
    EXEC ('create procedure dbo.YourSp as select 1')
GO
ALTER PROCEDURE dbo.YourSp
AS
...
 

De cette façon, les paramètres de sécurité, les commentaires et les autres méta-données survivront au déploiement.

155voto

Aaron Alton Points 9929

Le moyen le plus propre est de tester son existence, de le supprimer s'il existe, puis de le recréer. Vous ne pouvez pas incorporer une instruction "create proc" dans une instruction IF. Cela devrait faire l'affaire:

 IF OBJECT_ID('MySproc', 'P') IS NOT NULL
DROP PROC MySproc
GO

CREATE PROC MySproc
AS
BEGIN
    ...
END
 

33voto

JasonS Points 7751

Si vous ne traitez que des procédures stockées, la solution la plus simple consiste probablement à abandonner le processus, puis à le recréer. Pour ce faire, vous pouvez générer tout le code à l'aide de l'assistant de génération de scripts dans SQL Server.

 IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[YourSproc]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[YourSproc]

CREATE PROCEDURE YourSproc...
 

13voto

Luke Schafer Points 6250

EDIT: ne pas mettre du texte avant que les blocs de code ne le tue ... oubliez toujours ça :)

 if not exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[xxx]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
BEGIN
CREATE PROCEDURE dbo.xxx
 

où xxx est le nom de proc

4voto

Remus Rusanu Points 159382

En plus de ce qui a déjà été dit, je tiens à ajouter une approche différente et préconisent l'utilisation de la différence de script de déploiement de la stratégie. Au lieu de faire avec un état de script qui vérifie toujours l'état actuel et les actes fondés sur celui de l'état, de déployer via une série de apatrides scripts de mise à niveau de bien-les versions connues. J'ai utilisé cette stratégie et elle est payante grand temps que mes scripts de déploiement sont maintenant tous les "SI", gratuit.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X