120 votes

L'équivalent pour le serveur SQL de la commande CREATE OR REPLACE VIEW d'Oracle.

Dans Oracle, je peux recréer une vue avec une seule instruction, comme indiqué ici :

CREATE OR REPLACE VIEW MY_VIEW AS
SELECT SOME_FIELD
FROM SOME_TABLE
WHERE SOME_CONDITIONS

Comme la syntaxe l'indique, cela va supprimer l'ancienne vue et la recréer avec la définition que j'ai donnée.

Existe-t-il un équivalent dans MSSQL (SQL Server 2005 ou ultérieur) qui fera la même chose ?

107voto

John DaCosta Points 1718

Les solutions ci-dessus, bien qu'elles permettent d'accomplir le travail, le font au risque de perdre les autorisations de l'utilisateur. Je préfère créer ou remplacer des vues ou des procédures stockées de la manière suivante.

IF NOT EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[vw_myView]'))
    EXEC sp_executesql N'CREATE VIEW [dbo].[vw_myView] AS SELECT ''This is a code stub which will be replaced by an Alter Statement'' as [code_stub]'
GO

ALTER VIEW [dbo].[vw_myView]
AS
SELECT 'This is a code which should be replaced by the real code for your view' as [real_code]
GO

2 votes

J'avais l'habitude d'être une personne "Drop" puis (re) "Add". Mais maintenant, je penche pour ce type de solution (ajouter si ce n'est pas là, puis modifier).

0 votes

Modifier une vue est bien mieux que de l'abandonner et de la recréer. Et si vous avez beaucoup de configurations de sécurité d'utilisateurs existants pour une vue, alors vous devrez les recréer toutes. C'est mon approche de ce problème.

0 votes

Vos CREATE et ALTER font des choses différentes.... pourquoi ? (L'un est dynamique, l'autre non, et ils ont des messages différents).

45voto

DaveK Points 2915

Vous pouvez utiliser 'IF EXISTS' pour vérifier si la vue existe et la supprimer si c'est le cas.

IF EXISTS (SELECT TABLE\_NAME FROM INFORMATION\_SCHEMA.VIEWS
        WHERE TABLE\_NAME = 'MyView')
    DROP VIEW MyView
GO

CREATE VIEW MyView
AS 
     ....
GO

13 votes

Le problème est que vous perdez toutes les autorisations qui pouvaient exister sur l'objet qui a été abandonné.

14voto

Tom Points 1101

J'utilise :

IF OBJECT_ID('[dbo].[myView]') IS NOT NULL
DROP VIEW [dbo].[myView]
GO
CREATE VIEW [dbo].[myView]
AS

...

Récemment, j'ai ajouté quelques procédures utilitaires pour ce genre de choses :

CREATE PROCEDURE dbo.DropView
@ASchema VARCHAR(100),
@AView VARCHAR(100)
AS
BEGIN
  DECLARE @sql VARCHAR(1000);
  IF OBJECT_ID('[' + @ASchema + '].[' + @AView + ']') IS NOT NULL
  BEGIN
    SET @sql  = 'DROP VIEW ' + '[' + @ASchema + '].[' + @AView + '] ';
    EXEC(@sql);
  END 
END

Alors maintenant j'écris

EXEC dbo.DropView 'mySchema', 'myView'
GO
CREATE View myView
...
GO

Je pense que cela rend mes scripts de modification un peu plus lisibles.

8voto

Michael Petrotta Points 35647

J'utilise généralement quelque chose comme ça :

if exists (select * from dbo.sysobjects
  where id = object_id(N'dbo.MyView') and
  OBJECTPROPERTY(id, N'IsView') = 1)
drop view dbo.MyView
go
create view dbo.MyView [...]

2voto

Bryant Points 7185

Vous pouvez utiliser ALTER pour mettre à jour une vue, mais cela est différent de la commande Oracle car cela ne fonctionne que si la vue existe déjà. Il est probablement préférable de suivre la réponse de DaveK, car elle fonctionnera toujours.

1 votes

Bien que ALTER conserve les permissions existantes (et conserve l'ancienne version si la nouvelle version comporte des erreurs de syntaxe, etc.) Ainsi, l'utilisation de IF NOT EXISTS ... pour créer un Stub, puis de ALTER pour le remplacer/original peut être plus efficace pour maintenir les permissions et les dépendances.

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