W wystąpieniu programu SQL Server 2014 z wystarczającą ilością pamięci RAM i szybkimi dyskami ponad 160 użytkowników ma dostęp do bazy danych. Z jakiegoś powodu mi nie wiadomo, uruchomienie polecenia DROP USER [username]
w tej bazie danych trwa do 5 sekund na użytkownika.
Ponowne przypisywanie użytkowników do loginów i przywracanie ich uprawnień jest bardzo szybkie.
W kontekście odświeżania baz danych DEV z produkcji muszę usunąć i ponownie utworzyć wszystkich użytkowników baz danych. Tak, więc usunięcie użytkowników bazy danych i ich ponowne utworzenie jest konieczne.
Jak przyspieszyć DROP USER
polecenie?
Pamiętaj, że muszę uruchomić go ponad 160 razy dla instancji, o której piszę.
To jest SQL, którego używam:
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
Problem nie pochodzi od kursora; to rzeczywiste DROP USER
zajmuje do 5 sekund.
Korzystając z sp_whoisactive
, typ_wejścia to NULL
.
Nie zwracaj uwagi na czas trwania, DROP
i CREATE USER
były prowadzone w WHILE
pętli, dlatego mówi więcej niż minutę.
Profiler pokazuje ponad 125 000 odczytów do wykonania DROP USER
.
Service Broker nie jest włączony.
źródło
Odpowiedzi:
Rozwiązaniem tego problemu było włączenie brokera usług w bazie danych.
Po włączeniu brokera usług dla bazy danych użytkownicy zrzucali praktycznie natychmiast.
Kin zapytał, czy broker usług został włączony w poprzednim komentarzu, który skierował mnie na wyszukiwanie we właściwym kierunku.
źródło
nie jest to odpowiedź na pytanie, ale argument na całkowite jego oddalenie.
Jeśli dobrze rozumiem twój komentarz:
Twoim celem jest skopiowanie danych produkcyjnych do systemu deweloperskiego i pozwolenie, aby działało z takim samym uprawnieniem jak produkcyjne, przy użyciu tych samych nazw użytkowników .
Najszybszą ścieżką jest klonowanie loginów sql z systemu produkcyjnego do systemu deweloperskiego zgodnie z procedurą opisaną przez ms w tym artykule kb .
dzięki procedurze zdefiniowanej przez ms wynik jest taki, że możesz przywrócić bazy danych na serwerze deweloperskim, a pozwolenie działa bez zmian.
Z powodzeniem zastosowałem powyższą procedurę do skopiowania środowiska produkcyjnego SQL 2005 dla obu środowisk testowych i deweloperskich SQL 2012.
Po sklonowaniu użytkowników proste przywracanie bazy danych doprowadziło mnie do pary w pełni działających nowych systemów z aktualnymi danymi.
Ogromną zaletą tego rozwiązania jest to, że aby odświeżyć dane deweloperów, wystarczy przywrócić produkcyjną bazę danych i to wszystko; będziesz musiał dostosować odniesienia, synonimy i tym podobne, ale uprawnienia nie zostaną naruszone.
Oto kod z artykułu, tylko w celach informacyjnych, ale zapoznaj się z artykułem, który zawiera uwagi i szczegóły dotyczące zgodności ze starymi wersjami sql, szczegóły szyfrowania hasła i inne informacje, które mogą zaoszczędzić ci bólu głowy podczas przesyłania loginów między serwerami:
źródło
Kursor podobny do tego powinien działać
źródło