Je dois écrire un script de déploiement qui fonctionnera si une procédure stockée existe ou n'existe pas. c'est-à-dire s'il existe, je dois le modifier, sinon le créer.
Comment puis-je faire cela dans le sql.
J'utilise SQL Server 2005
Je dois écrire un script de déploiement qui fonctionnera si une procédure stockée existe ou n'existe pas. c'est-à-dire s'il existe, je dois le modifier, sinon le créer.
Comment puis-je faire cela dans le sql.
J'utilise SQL Server 2005
Réponses:
Si vous SUPPRIMEZ et CRÉER la procédure, vous perdrez les paramètres de sécurité. Cela pourrait ennuyer votre DBA ou casser complètement votre application.
Ce que je fais, c'est 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 guise.
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 autres méta-détails survivront au déploiement.
if object_id('YourSp') is null BEGIN ... END
pour ajouter les autorisations appropriées après la création de la procédure stockée.
La manière la plus propre est de tester son existence, de la supprimer si elle existe, puis de la recréer. Vous ne pouvez pas incorporer une instruction "create proc" dans une instruction IF. Cela devrait bien faire:
IF OBJECT_ID('MySproc', 'P') IS NOT NULL
DROP PROC MySproc
GO
CREATE PROC MySproc
AS
BEGIN
...
END
Si vous utilisez uniquement des procédures stockées, la chose la plus simple à faire est probablement de supprimer le processus, puis de le recréer. Vous pouvez générer tout le code pour ce faire à l'aide de l'assistant Générer des 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...
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 du proc
En plus de ce qui a déjà été dit, j'aime également ajouter une approche différente et préconiser l'utilisation d'une stratégie de déploiement de scripts différentiels. Au lieu de créer un script avec état qui vérifie toujours l'état actuel et agit en fonction de cet état, déployez via une série de scripts sans état qui sont mis à niveau à partir de versions bien connues . J'ai utilisé cette stratégie et elle est très rentable car mes scripts de déploiement sont désormais tous «IF» gratuits.
Vous pouvez écrire une requête comme suit:
IF OBJECT_ID('ProcedureName','P') IS NOT NULL
DROP PROC ProcedureName
GO
CREATE PROCEDURE [dbo].[ProcedureName]
...your query here....
Pour être plus précis sur la syntaxe ci-dessus:
OBJECT_ID est un numéro d'identification unique pour un objet dans la base de données, il est utilisé en interne par SQL Server. Puisque nous passons ProcedureName suivi de votre type d'objet P qui indique au serveur SQL que vous devez trouver l'objet appelé ProcedureName qui est de type procedure, c'est-à-dire P
Cette requête trouvera la procédure et si elle est disponible, elle la supprimera et en créera une nouvelle.
Pour des informations détaillées sur OBJECT_ID et les types d'objets, veuillez visiter: SYS.Objects
IF OBJECT_ID('SPNAME') IS NULL
-- Does Not Exists
ELSE
-- Exists
J'ai un proc stocké qui permet au client d'étendre la validation, s'il existe, je ne veux pas le changer, si ce n'est pas le cas, je veux le créer, de la meilleure façon que j'ai trouvée:
IF OBJECT_ID('ValidateRequestPost') IS NULL
BEGIN
EXEC ('CREATE PROCEDURE ValidateRequestPost
@RequestNo VARCHAR(30),
@ErrorStates VARCHAR(255) OUTPUT
AS
BEGIN
SELECT @ErrorStates = @ErrorStates
END')
END
Le code ci-dessous vérifiera si la procédure stockée existe déjà ou non.
S'il existe, il changera, s'il n'existe pas, il créera une nouvelle procédure stockée pour vous:
//syntax for Create and Alter Proc
DECLARE @Create NVARCHAR(200) = 'Create PROCEDURE sp_cp_test';
DECLARE @Alter NVARCHAR(200) ='Alter PROCEDURE sp_cp_test';
//Actual Procedure
DECLARE @Proc NVARCHAR(200)= ' AS BEGIN select ''sh'' END';
//Checking For Sp
IF EXISTS (SELECT *
FROM sysobjects
WHERE id = Object_id('[dbo].[sp_cp_test]')
AND Objectproperty(id, 'IsProcedure') = 1
AND xtype = 'p'
AND NAME = 'sp_cp_test')
BEGIN
SET @Proc=@Alter + @Proc
EXEC (@proc)
END
ELSE
BEGIN
SET @Proc=@Create + @Proc
EXEC (@proc)
END
go