Auf einer SQL Server 2014-Instanz mit genügend RAM und schnellen Festplatten haben über 160 Benutzer Zugriff auf eine Datenbank. Aus irgendeinem mir unbekannten Grund DROP USER [username]
dauert das Ausführen des Befehls in dieser Datenbank bis zu 5 Sekunden pro Benutzer.
Das erneute Zuordnen von Benutzern zu Anmeldungen und das Wiederherstellen ihrer Berechtigungen ist sehr schnell.
Im Rahmen der Aktualisierung von DEV-Datenbanken aus der Produktion muss ich alle Datenbankbenutzer löschen und neu erstellen. Es ist also notwendig, die Datenbankbenutzer zu löschen und neu zu erstellen.
Wie beschleunige ich den DROP USER
Befehl?
Denken Sie daran, ich muss es für die Instanz, über die ich schreibe, über 160 Mal ausführen.
Dies ist das SQL, das ich verwende:
DECLARE drop_user_cur CURSOR FOR
SELECT name FROM #drop_users
OPEN drop_user_cur
FETCH NEXT FROM drop_user_cur INTO @user
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = 'use [' + @db_name + '] DROP USER [' + @user + ']'
BEGIN TRY
print @sql
EXECUTE(@sql)
END TRY
BEGIN CATCH
print 'ERREUR : ' + @sql
END CATCH
FETCH NEXT FROM drop_user_cur INTO @user
END
CLOSE drop_user_cur
DEALLOCATE drop_user_cur
Das Problem kommt nicht vom Cursor; Es ist die tatsächliche Zeit DROP USER
, die bis zu 5 Sekunden dauert.
Mit sp_whoisactive
ist der wait_type NULL
.
Achten Sie nicht auf die Dauer, die DROP
und CREATE USER
in einem ausgeführt wurdenWHILE
Schleife ausgeführt, weshalb mehr als eine Minute angezeigt wird.
Der Profiler zeigt über 125.000 auszuführende Lesevorgänge an DROP USER
.
Service Broker ist nicht aktiviert.
quelle
Antworten:
Die Lösung für dieses Problem bestand darin, den Service Broker für die Datenbank zu aktivieren.
Nach dem Aktivieren des Service Brokers für die Datenbank waren Drop-Benutzer praktisch sofort verfügbar.
Kin fragte, ob der Service Broker in einem früheren Kommentar aktiviert war, der mich in die richtige Richtung suchte.
quelle
Dies ist keine Antwort auf die Frage, sondern ein Argument, sie insgesamt abzulehnen.
Wenn ich Ihren Kommentar richtig verstehe:
Ihr Ziel ist es, Produktionsdaten auf ein Entwicklungssystem zu kopieren und mit derselben Berechtigung wie das Produktionssystem unter Verwendung derselben Benutzernamen arbeiten zu lassen .
Der schnellste Weg besteht darin, SQL-Anmeldungen vom Produktionssystem auf das Entwicklungssystem zu klonen, indem Sie das in diesem KB-Artikel von ms beschriebene Verfahren verwenden .
Mit der durch ms definierten Prozedur können Sie die Datenbanken auf Ihrem Entwicklungsserver wiederherstellen und die Berechtigung funktioniert ohne Änderungen.
Ich habe das oben erwähnte Verfahren erfolgreich verwendet, um eine SQL 2005-Produktionsumgebung auf Test- und Dev SQL 2012-Umgebungen zu kopieren.
Nach dem Klonen der Benutzer führte mich eine einfache Datenbankwiederherstellung zu zwei voll funktionsfähigen neuen Systemen mit aktuellen Daten.
Das große Plus dieser Lösung ist, dass Sie zum Aktualisieren von Entwicklungsdaten einfach die Produktionsdatenbank wiederherstellen und fertig. Sie müssen Referenzen, Synonyme und dergleichen anpassen, aber die Berechtigungen werden nicht verletzt.
Hier ist der Code aus dem Artikel, nur als Referenz, aber bitte lesen Sie den Artikel, der Anmerkungen und Details zur Kompatibilität mit alten SQL-Versionen, Details zur Kennwortverschlüsselung und andere Informationen enthält, die Ihnen beim Übertragen der Anmeldungen zwischen Servern Kopfschmerzen ersparen können:
quelle
Ein ähnlicher Cursor sollte funktionieren
quelle