web-dev-qa-db-fra.com

SQL créer une base de données s'il n'existe pas, comportement inattendu

J'ai une longue procédure stockée qui commence par la déclaration suivante:

IF  NOT EXISTS (SELECT * FROM sys.databases WHERE name = N'DBNAME')
    BEGIN
        CREATE DATABASE [DBNAME]
    END;

Il est prévu de créer la base de données sur mon serveur local, s'il n'existe pas. Le problème est que presque tout le temps, il parcourt cette partie de la procédure stockée et ne le crée pas, ce qui interfère alors avec l'autre code de la même procédure. En revanche, dans de très rares cas, il crée la DB. Ma question est: existe-t-il un meilleur moyen de vérifier si la base de données existe, car j'ai déjà essayé au moins 10.

J'ai essayé d'autres façons:

IF  NOT EXISTS (SELECT 1 FROM sys.databases WHERE name = N'DBNAME')
    BEGIN
        CREATE DATABASE [DBNAME]
    END;

IF  NOT EXISTS (SELECT name FROM sys.databases WHERE name = N'DBNAME')
        BEGIN
            CREATE DATABASE [DBNAME]
        END;

IF  NOT EXISTS (SELECT name FROM master.dbo.sys.databases WHERE name = N'DBNAME')
            BEGIN
                CREATE DATABASE [DBNAME]
        END;

Mais si je l'exécute en dehors de mon sp, cela fonctionne parfaitement, ce qui me fait penser que cela peut être un problème lié aux autorisations.

12
StefanL19

Essayez d'utiliser

 If(db_id(N'DBNAME') IS NULL)

Si cela ne fonctionne pas, ce pourrait être les autorisations. Cela expliquerait pourquoi vous ne recevez pas de message d'erreur.

... les autorisations minimales requises pour voir la ligne correspondante sont ALTER ANY DATABASE ou VIEW ANY DATABASE au niveau du serveur, ou CREATE DATABASE dans la base de données master. La base de données à laquelle l'appelant est connecté peut toujours être consultée dans sys.databases

(De sys.databases sur la documentation MS )

De quelles autorisations dispose l'utilisateur sous lequel vous exécutez?

Essayez de changer votre code pour renvoyer simplement le contenu de sys.databases afin que vous puissiez le voir.

19
under

J'interviens car j'ai eu un problème similaire: je voulais créer une base de données si elle n'existe pas, puis effectuer des opérations sur cette base de données.

Je pense que le problème était que le script a essayé de s'exécuter en un seul lot, il a donc essayé de USE la base de données avant que le serveur SQL reçoive la commande CREATE. Cela a entraîné le rétablissement de l'ensemble du script et il semblait que la racine du problème était que la base de données n'a jamais été créée.

Dans mon cas, la solution était de ajouter une commande GO après la partie initiale du script où la table est créée mais avant de commencer à travailler avec elle (par exemple, créer des tables).

1
martonbognar