Benutzer mit den meisten Antworten
Problem beim Anmelden an neu erstellter Datenbank

Frage
-
Hallo,
ich habe folgende Situation:
- ich arbeite programmgesteuert (VB.NET) am SQL-Server 2008
- Habe einen User, der eine neue Datenbank anlegt (CREATE DATABASE name)
- Als nächstes möchte ich eine Verbindung zu dieser Datenbank aufbauen, um verschiedene Operationen durchzuführen. Dabei tritt folgendes merkwürdige Verhalten auf:
- wenn ich das Programm laufen lasse, dann bekomme ich einen Verbindungsfehler (Die von der Anwendung angeforderte Datenbank name kann nicht geöffnet werden. Fehler bei der Anmeldung. Fehler bei der Anmeldung für Benutzer xyz)
- wenn ich das Programm jedoch im Einzelschrittmodus durchgehe, dann funktioniert es ohne Fehler.
Wie kann man es umgehen/beheben?
Danke vorab für jeden Tipp
Gruß
Peter
Antworten
-
Hallo Peter,
CREATE DATABASE wird synchron ausgeführt.
Für DDL Befehle solltest Du ExecuteNonQuery verwenden.
Denn Problem könnte - ich habs jetzt nicht probiert - indirekt durch ExecuteScalar resultieren,
da dort das erste Ergebnis geliefert wird; nur das CREATE DATABASE keines hat.
Und wenn Du mehrere Befehle im Batch absetzt, könntest Du vorzeitig zurückkehren.
Das Erstellen einer Datenbank sollte im master Kontext (Initial Catalog=master)
und am besten nicht gepoolt (Pooling=False) erfolgen.
Zum Abschluß Deiner DDL Befehle kannst Du den Datenbankstatus auf ONLINE abfragen
um ganz sicher zu gehen.
Gruß Elmar- Als Antwort markiert Peter_4711 Montag, 11. Januar 2010 16:19
-
Hallo Peter,
handelt es sich evtl. um eine Benutzerinstanz - was verwendest Du als Verbindungszeichenfolge?
Zeige ggf. mal (gekürzt aufs Wesentliche) den Code den Du bei der Anlage verwendest.
Was die Verbindung bei der Anlage angeht: Du solltest dafür eine eigene Verbindung.
Denn durch das Standard-Verbindungspooling kann es zum einen solche Verzögerungseffekte geben.
Und da der Pooling Cache sich jeweils an der Verbindungszeichenfolge orientiert
wird u. U. versucht eine bestehende Verbindung erneut zu nutzen.
Um das Erzeugen der speziellen Verbindung zu vereinfachen, kannst Du den SqlConnectionStringBuilder
mit der Standard-Verbindung füttern und den Initial Catalog und die Pooling Einstellung verändern.
Nicht Teil des Problems - aber grundsätzlich bedacht werden sollte:
Aus Sicherheitsgründen sollte später nur mit einem Konto mit geringeren Rechten gearbeitet werden.
Ein Admin-Konto wie z. B. "sa", das Datenbanken anlegen darf, ist in der Regel als Standardkonto zuviel -
ebenso wie mit dem Administrator Konto unter Windows zu arbeiten.
Gruß Elmar- Als Antwort markiert Peter_4711 Montag, 11. Januar 2010 16:19
-
Hallo Elmar,
das Pooling war's. Ich dachte, wenn ich die Verbindung schließe und alle Objekte Dispose, dann kann ja nichts gepoolt werden. Insofern war Dein Hinweis sehr wichtig. Danke nochmals. Habe den SqlConnectionStringBuilder genutzt, wie Du vorgeschlagen hast.
Für den normalen User wird direkt mit der Kopie der Datenbank ein Benutzerkonto angelegt, dessen Rollendefinition seine Rechte möglichst genau einschränkt.
Gruß und schönen Tag noch
Peter
- Als Antwort markiert Peter_4711 Montag, 11. Januar 2010 16:19
Alle Antworten
-
Hallo,
ich habe den Fehler weiter eingegrenzt. Wenn ich eine 5 sec Warteschleife einbaue, dann kann ich auf die neue Datenbank zugreifen.
Dann müsste es doch einen Befehl geben, mit dem ich die Ausführung entweder erzwingen kann oder erfahre, dass der Befehl (Datenbank anlegen) noch nicht fertig ausgeführt ist. Ich verwende derzeit executeScalar dafür, um den Befehl abzusetzen. Geht das eventuell besser?
Das mit der Warteschleife ist mir zu risikoreich. Könnte sein, dass es schon beim nächsten Mal 7 sec sein müssen.
Danke für jeden Hinweis!
Gruß
Peter -
Hallo Peter,
CREATE DATABASE wird synchron ausgeführt.
Für DDL Befehle solltest Du ExecuteNonQuery verwenden.
Denn Problem könnte - ich habs jetzt nicht probiert - indirekt durch ExecuteScalar resultieren,
da dort das erste Ergebnis geliefert wird; nur das CREATE DATABASE keines hat.
Und wenn Du mehrere Befehle im Batch absetzt, könntest Du vorzeitig zurückkehren.
Das Erstellen einer Datenbank sollte im master Kontext (Initial Catalog=master)
und am besten nicht gepoolt (Pooling=False) erfolgen.
Zum Abschluß Deiner DDL Befehle kannst Du den Datenbankstatus auf ONLINE abfragen
um ganz sicher zu gehen.
Gruß Elmar- Als Antwort markiert Peter_4711 Montag, 11. Januar 2010 16:19
-
Hallo Elmar,
danke für den Tipp.
Habe es so umgesetzt.
Datenbankstatus auf ONLINE abgefragt.
Meine Warteschleife entfernt.
Gleicher Fehler.
Warteschleife wieder eingebaut.
Funktioniert.
Bin verwirrt, insbesondere, weil ich ja den Datenbankstatus abgefragt hatte bevor ich die Verbindung abgebaut und die zur neuen Datenbank aufgebaut habe.
Kann man eine Verbindung zur master-DB auch "umeiten" zu der neuen Datenbank oder muss man dazu eine neue verbindung öffnen?
Gruß
Peter
-
Hallo Peter,
handelt es sich evtl. um eine Benutzerinstanz - was verwendest Du als Verbindungszeichenfolge?
Zeige ggf. mal (gekürzt aufs Wesentliche) den Code den Du bei der Anlage verwendest.
Was die Verbindung bei der Anlage angeht: Du solltest dafür eine eigene Verbindung.
Denn durch das Standard-Verbindungspooling kann es zum einen solche Verzögerungseffekte geben.
Und da der Pooling Cache sich jeweils an der Verbindungszeichenfolge orientiert
wird u. U. versucht eine bestehende Verbindung erneut zu nutzen.
Um das Erzeugen der speziellen Verbindung zu vereinfachen, kannst Du den SqlConnectionStringBuilder
mit der Standard-Verbindung füttern und den Initial Catalog und die Pooling Einstellung verändern.
Nicht Teil des Problems - aber grundsätzlich bedacht werden sollte:
Aus Sicherheitsgründen sollte später nur mit einem Konto mit geringeren Rechten gearbeitet werden.
Ein Admin-Konto wie z. B. "sa", das Datenbanken anlegen darf, ist in der Regel als Standardkonto zuviel -
ebenso wie mit dem Administrator Konto unter Windows zu arbeiten.
Gruß Elmar- Als Antwort markiert Peter_4711 Montag, 11. Januar 2010 16:19
-
Hallo Elmar,
das Pooling war's. Ich dachte, wenn ich die Verbindung schließe und alle Objekte Dispose, dann kann ja nichts gepoolt werden. Insofern war Dein Hinweis sehr wichtig. Danke nochmals. Habe den SqlConnectionStringBuilder genutzt, wie Du vorgeschlagen hast.
Für den normalen User wird direkt mit der Kopie der Datenbank ein Benutzerkonto angelegt, dessen Rollendefinition seine Rechte möglichst genau einschränkt.
Gruß und schönen Tag noch
Peter
- Als Antwort markiert Peter_4711 Montag, 11. Januar 2010 16:19