Mam środowisko testowe dla bazy danych, którą chcę ponownie załadować z nowymi danymi na początku cyklu testowania. Nie jestem zainteresowany przebudową całej bazy danych - po prostu „resetuję” dane.
Jaki jest najlepszy sposób na usunięcie wszystkich danych ze wszystkich tabel za pomocą TSQL? Czy istnieją procedury systemowe, widoki itp., Które można wykorzystać? Nie chcę ręcznie tworzyć i obsługiwać obcinanych instrukcji tabel dla każdej tabeli - wolałbym, aby była dynamiczna.
sql-server
tsql
Promień
źródło
źródło
Podczas usuwania danych z tabel, które mają powiązania z kluczem obcym - co w zasadzie ma miejsce w przypadku właściwie zaprojektowanej bazy danych - możemy wyłączyć wszystkie ograniczenia, usunąć wszystkie dane, a następnie ponownie włączyć ograniczenia
Więcej informacji na temat wyłączania ograniczeń i wyzwalaczy tutaj
jeśli niektóre tabele mają kolumny tożsamości, możemy chcieć je ponownie załadować
Zauważ, że zachowanie RESEED różni się w zależności od nowej tabeli i tabeli, w której wcześniej wstawiono niektóre dane z BOL :
Dzięki Robertowi za zwrócenie uwagi na fakt, że wyłączenie ograniczeń nie pozwala na użycie obcięcia, ograniczenia musiałyby zostać usunięte, a następnie odtworzone
źródło
SET ROWCOUNT 0
na początku skryptu, ponieważ domyślnie jest to ograniczenie akcji do 500 wierszy! Dostaniesz frustrujące błędy, tak jak ja, ponieważ nie wszystkie dane zostaną faktycznie usunięte.Oto królewski tata skryptów do czyszczenia baz danych. Spowoduje to wyczyszczenie wszystkich tabel i prawidłowe ich ponowne załadowanie:
Ciesz się, ale bądź ostrożny!
źródło
SET QUOTED_IDENTITY OFF
w swoim ciele ( link ). AKTUALIZACJA: Poprawka polega na dodaniu „SET QUOTED_IDENTIFIERS on;” na początku każdego stwierdzenia, które powoduje ten błąd (jak wspomniano tutaj )Najprostszym sposobem na to jest
da ci to skrypt, który upuszcza i odtwarza wszystkie tabele bez potrzeby martwienia się o debugowanie lub o to, czy wszystko załączyłeś. Chociaż wykonuje to więcej niż tylko obcinanie, wyniki są takie same. Pamiętaj tylko, że automatycznie zwiększające się klucze podstawowe zaczną od 0, w przeciwieństwie do skróconych tabel, które zapamiętują ostatnią przypisaną wartość. Możesz to również wykonać z kodu, jeśli nie masz dostępu do Management Studio w środowisku PreProd lub produkcyjnym.
1.
2)
3)
źródło
Obcinanie wszystkich tabel będzie działać tylko wtedy, gdy nie będzie żadnych relacji między kluczami obcymi między tabelami, ponieważ SQL Server nie pozwoli na obcięcie tabeli za pomocą klucza obcego.
Alternatywą jest określenie tabel z kluczami obcymi i usunięcie z nich najpierw, a następnie można obciąć tabele bez kluczy obcych.
Zobacz http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=65341 i http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=72957 dla dalszych szczegółów.
źródło
Alternatywną opcją, którą lubię używać z MSSQL Server Deveploper lub Enterprise, jest utworzenie migawki bazy danych natychmiast po utworzeniu pustego schematu. W tym momencie możesz po prostu przywracać bazę danych z powrotem do migawki.
źródło
Nie rób tego! Naprawdę niezbyt dobry pomysł.
Jeśli wiesz, które tabele chcesz obciąć, utwórz procedurę składowaną, która je obetnie. Możesz ustalić kolejność, aby uniknąć problemów z kluczem obcym.
Jeśli naprawdę chcesz je obciąć (aby na przykład załadować je BCP), równie szybko możesz usunąć bazę danych i utworzyć nową od podstaw, co miałoby dodatkową korzyść, którą wiesz dokładnie, gdzie jesteś.
źródło
Jeśli chcesz zachować dane w określonej tabeli (tj. Statycznej tabeli wyszukiwania), jednocześnie usuwając / obcinając dane w innych tabelach w tym samym pliku db, potrzebujesz pętli z wyjątkami. Właśnie tego szukałem, gdy natknąłem się na to pytanie.
sp_MSForEachTable wydaje mi się błędny (tj. niespójne zachowanie z instrukcjami IF) i prawdopodobnie dlatego jest nieudokumentowany przez MS.
źródło
Najtrudniejszą częścią obcinania wszystkich tabel jest usunięcie i ponowne dopasowanie ograniczeń klucza obcego.
Poniższe zapytanie tworzy instrukcje drop & create dla każdego ograniczenia związanego z nazwą każdej tabeli w @myTempTable. Jeśli chcesz wygenerować je dla wszystkich tabel, możesz po prostu użyć schematu informacji, aby zamiast tego zebrać nazwy tabel.
Następnie po prostu kopiuję instrukcje do uruchomienia - ale przy odrobinie wysiłku dewelopera możesz użyć kursora, aby uruchomić je dynamicznie.
źródło
Znacznie łatwiej (a być może nawet szybciej) wykasować bazę danych, a następnie po prostu upuścić i utworzyć ją ze skryptu.
źródło
Utwórz pustą bazę „szablonów”, zrób pełną kopię zapasową. Kiedy musisz odświeżyć, po prostu przywróć za pomocą Z WYMIANY. Szybki, prosty, kuloodporny. A jeśli kilka tabel tutaj lub tam potrzebuje pewnych danych podstawowych (np. Informacji o konfiguracji lub tylko podstawowych informacji, które powodują, że aplikacja działa), to również to obsługuje.
źródło
Jest to jeden ze sposobów, aby to zrobić ... prawdopodobnie jest 10 innych, które są lepsze / bardziej wydajne, ale wygląda na to, że robi się to bardzo rzadko, więc proszę ...
uzyskaj listę
tables
odsysobjects
, a następnie przewiń kursorem kursor, wywołującsp_execsql('truncate table ' + @table_name)
każdą z nichiteration
.źródło
Uruchom raz komentowaną sekcję, zapełnij tabelę _TruncateList tabelami, które chcesz obciąć, a następnie uruchom resztę skryptu. Tabela _ScriptLog będzie musiała zostać z czasem wyczyszczona, jeśli często to robisz.
Możesz to zmienić, jeśli chcesz wykonać wszystkie tabele, po prostu wpisz WYBIERZ nazwę DO #TruncateList FROM sys.tables. Zazwyczaj jednak nie chcesz robić ich wszystkich.
Wpłynie to również na wszystkie klucze obce w bazie danych i możesz to również zmodyfikować, jeśli jest to zbyt tępe dla twojej aplikacji. To nie do moich celów.
źródło
Nie rozumiem, dlaczego czyszczenie danych byłoby lepsze niż skrypt, aby upuścić i ponownie utworzyć każdą tabelę.
To lub zachowaj kopię zapasową pustej bazy danych i przywróć ją do starej
źródło
Przed obcięciem tabel musisz usunąć wszystkie klucze obce. Ten skrypt służy do generowania ostatecznych skryptów do upuszczania i ponownego tworzenia wszystkich kluczy obcych w bazie danych. Ustaw zmienną @action na „CREATE” lub „DROP”.
źródło
wybierz „usuń z” + TABLE_NAME z INFORMACJE_SCHEMA.TABLES gdzie TABLE_TYPE = „BASE TABLE”
skąd wynik.
Skopiuj i wklej w oknie zapytania i uruchom polecenie
źródło
Jest trochę późno, ale może komuś pomóc. Czasami utworzyłem procedurę, która wykonuje następujące czynności przy użyciu T-SQL:
Umieściłem go tutaj na moim blogu
źródło