it-swarm.com.de

SQL-Datenbank erstellen, falls nicht vorhanden, unerwartetes Verhalten

Ich habe eine lange gespeicherte Prozedur, die mit der folgenden Anweisung beginnt:

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

Es wird erwartet, dass die Datenbank auf meinem lokalen Server erstellt wird, falls sie nicht vorhanden ist. Das Problem ist, dass dieser Teil der gespeicherten Prozedur fast immer durchlaufen wird und nicht erstellt wird, wodurch der andere Code derselben Prozedur gestört wird. Andererseits wird in sehr seltenen Fällen die DB erstellt. Meine Frage ist: Gibt es eine bessere Möglichkeit, um zu überprüfen, ob die DB vorhanden ist, da ich bereits mindestens 10 ausprobiert habe.

Andere Möglichkeiten, die ich ausprobiert habe:

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;

Aber wenn ich es außerhalb meines SPs laufen lasse, funktioniert es perfekt, was mich denken lässt, dass es ein Problem im Zusammenhang mit Berechtigungen sein kann.

12
StefanL19

Versuchen Sie es mit

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

Wenn das nicht funktioniert, könnten es die Berechtigungen sein. Das würde erklären, warum Sie keine Fehlermeldung erhalten.

Zum Anzeigen der entsprechenden Zeile sind mindestens die Berechtigungen ALTER ANY DATABASE oder VIEW ANY DATABASE auf Serverebene oder CREATE DATABASE in der master-Datenbank erforderlich. Die Datenbank, mit der der Anrufer verbunden ist, kann immer in sys.databases angezeigt werden

(From sys.databases in der MS-Dokumentation )

Welche Berechtigungen hat der Benutzer, unter dem Sie ausgeführt werden?

Versuchen Sie, Ihren Code so zu ändern, dass nur der Inhalt von sys.databases zurückgegeben wird, damit Sie ihn sehen können.

19
under

Ich mischte mich ein, weil ich ein ähnliches Problem hatte: Ich wollte eine Datenbank erstellen, wenn sie nicht vorhanden ist, und dann Operationen an dieser Datenbank ausführen.

Ich denke, das Problem war, dass das Skript versuchte, in einem Stapel ausgeführt zu werden, also versuchte es, die Datenbank zu USE, bevor der SQL-Server den Befehl CREATE erhielt. Dies führte dazu, dass das gesamte Skript zurückgesetzt wurde, und es schien, dass die Ursache des Problems darin bestand, dass die Datenbank nie erstellt wurde.

In meinem Fall bestand die Lösung darin, nach dem ersten Teil des Skripts, in dem die Tabelle erstellt wird, aber bevor ich anfange, damit zu arbeiten (z. B. Tabellen zu erstellen), einen GO -Befehl hinzuzufügen .

1
martonbognar