Vues en tant que procédures stockées dans le script de modification de schéma

J'ai écrit un script de modification pour mettre à jour le schéma dans la database de production. Je dois supprimer une vue et les recréer puisque l'une des colonnes de cette vue est supprimée maintenant.

Je prévois d'utiliser,

DECLARE @sql NVARCHAR(MAX); SET @sql = '<View Definition>'; EXEC sp_executesql @sql; 

Le cas échéant, Quels sont les pièges de l'utilisation de cette approche? Quelles sont les alternatives que vous suggéreriez?

J'ai tout le script sous une transaction avec un bloc Try catch. Donc, quand il n'y a pas d'erreur, le script sera validé. J'ai essayé d'utiliser la command CREATE VIEW comme ci-dessous, mais j'obtiens une erreur après l'introduction de TRASACTION et TRY-CATCH BLOCKS.Cette raison pour laquelle je lance l'instruction SQL dynamic – EXEC sp_executesql .

L'erreur est "CREATE VIEW DOIT ÊTRE LA SEULE DÉCLARATION DANS LE BATCH"

 IF EXISTS ( SELECT * FROM sys.views WHERE name = 'VwViewName') BEGIN DROP VIEW VwViewName END IF NOT EXISTS ( SELECT * FROM sys.views WHERE name = 'VwViewName') BEGIN CREATE VIEW VwViewName <VIEW DEFINITION> END 

Puisque vous exécutez la mise à jour du schéma, vous devez respecter des conditions minimales comme

  • le rendre répétable
  • l'avoir dans votre système de versionnage
  • et testez-le dans votre environnement de test avant de l'exécuter en production.

Pour le rendre exécutable, il est courant de vérifier si l'object existe et de le supprimer, puis de le créer à nouveau.

SQL dynamic n'appenda aucune fonctionnalité que la clause IF a.

Par exemple:

 IF EXISTS(SELECT * FROM sys.views WHERE name = 'MyView') BEGIN DROP VIEW [MyView] END GO CREATE VIEW MyView AS SELECT [Columns list ] FROM [MyTable] GO 

Le seul cas que je connaisse qui justifie dynamic SQL est si vous voulez conserver grant / deny , dans ce cas vous pouvez utiliser la syntaxe suivante.

 IF NOT EXISTS(SELECT * FROM sys.views WHERE name = 'MyView') BEGIN EXEC sp_executesql N'CREATE VIEW MyView AS SELECT 1 AS Dummy' END GO ALTER VIEW MyView AS SELECT [Columns list ] FROM [MyTable] go GRANT .... 

Je ne voudrais pas créer un Dynamic SQL pour remplir les quelques fois que je dois répéter les noms dans l'un des scripts ci-dessous. À mon humble avis le script de deployment devrait être aussi simple que possible.