2013-09-07 17 views
5

Czy istnieje sposób na upuszczenie wszystkich obiektów w bazie danych z obiektami należącymi do dwóch różnych schematów?Porzuć wszystkie obiekty w bazie danych SQL Server, które należą do różnych schematów?

miałem wcześniej pracujący z jednym schematem, więc zbadać wszystkie obiekty przy użyciu:

Select * From sysobjects Where type=... 

następnie spadła wszystko ja korzystając

Drop Table ... 

Teraz, kiedy wprowadzono inny schemat, za każdym razem, kiedy spróbuj ją upuścić, mówi coś o tym, że nie mam pozwolenia lub obiekt nie istnieje. ALE, jeśli przedrostek obiektu z [schema.object] działa. Nie wiem, jak to zautomatyzować, ponieważ nie wiem, jakie obiekty lub do którego schematów należy obiekt. Ktoś wie, jak upuścić wszystkie obiekty wewnątrz bazy danych, bez względu na to, do którego schematu należy?

(Zużyty użytkownik jest właścicielem obu schematów, obiekty w DB zostały stworzone przez wspomnianego użytkownika, jak również dla użytkownika, który jest usuwanie obiektów. - która działa jeśli prefiks użyłem IE Drop Table Schema1.blah)

+1

Podpowiedź: sysschemas. W rzeczywistości: sys.schemas –

Odpowiedz

3

Zastosowanie sys.objects w połączeniu z OBJECT_SCHEMA_NAME zbudować DROP TABLE sprawozdań, recenzje, skopiuj/wklej aby wykonać:

SELECT 'DROP TABLE ' + 
     QUOTENAME(OBJECT_SCHEMA_NAME(object_id)) + '.' + 
     QUOTENAME(name) + ';' 
    FROM sys.objects 
WHERE type_desc = 'USER_TABLE'; 

Albo użyć sys.tables aby uniknąć konieczności filtra type_desc:

SELECT 'DROP TABLE ' + 
     QUOTENAME(OBJECT_SCHEMA_NAME(object_id)) + '.' + 
     QUOTENAME(name) + ';' 
    FROM sys.tables; 

SQL Fiddle

+2

Plus, od wersji SQL Server ** 2005 ** i nowszej, polecam używanie bardziej skupionego widoku 'sys.tables' zamiast wybierania z' sys.objects' i konieczności podania 'type_desc '.... –

+1

@marc_s Dobry punkt, zredagowany w celu włączenia' sys.tables' – Bryan

+0

To jest dokładnie to, czego szukałem, czy to jest to samo, co sys.schemas pierwotnie zalecany? Jedyny problem, na który wpadłem, czy chciałem upuścić wszystkie obiekty, i udało mi się znaleźć wszystkie sys.table, sys.vew itp., Z wyjątkiem funkcji. Ale twoja pierwsza sugestia działała dobrze. –

0

nie wiem wersję Wich SQL Server używasz, ale przy założeniu, że jest 2008 lub później, może następujące polecenie będzie bardzo przydatna (sprawdzić, czy można upuścić wszystkie tabele w jednym prostym linia):

sp_MSforeachtable "USE DATABASE_NAME DROP TABLE ?" 

Ten skrypt wykona DROP TABLE .... dla wszystkich tabel z bazy danych dATABASE_NAME. Jest bardzo prosty i działa idealnie. Polecenie to może być wykorzystane do wykonania innych instrukcji sql, na przykład:

sp_MSforeachtable "USE DATABASE_NAME SELECT * FROM ?" 
+1

'use' zmienia bieżącą ** bazę **, a nie bieżący schemat (nie jestem nawet pewien, czy istnieje koncepcja schematu * bieżącego * w SQL Server) –

+0

@a_horse_with_no_name przepraszam za mój błąd, mój post został poprawiony. Dzięki. –

3

Żaden z pozostałych pytań wydaje się, że próbowali zająć się wszystkich obiektów część pytania.

Jestem zaskoczony, że musicie przetoczyć się z tym - spodziewałem się, że spadnie schemat kaskady bla. Z pewnością każda osoba, która konfiguruje serwer dev, będzie musiała to zrobić i konieczność przeprowadzenia meta-programowania, zanim będzie mogła wykonywać normalne programowanie, jest naprawdę okropna. W każdym razie ... rant się!

Zacząłem przeglądać niektóre z tych artykułów jako sposób na zrobienie tego poprzez wyczyszczenie schematu: Jest tam old article o tym, jednak tabele wymienione na tej stronie są teraz marked as deprecated. Przyjrzałem się także documentation for the new tables, aby pomóc zrozumieć, co się tutaj dzieje.

Jest another answer i great dynamic sql resource do którego prowadzi.

Po obejrzeniu wszystkich tych rzeczy przez chwilę wszystko wydawało się nieco zbyt brudne.

Myślę, że lepszym rozwiązaniem jest, aby przejść do

ALTER DATABASE 'blah' SET SINGLE_USER WITH ROLLBACK IMMEDIATE 
drop database 'blah' 

create database 'blah' 

zamiast. Dodatkowa inkantacja u góry jest w zasadzie wymuszeniem upuszczenia bazy danych pod postacią mentioned here

To trochę źle, ale ilość złożoności związanej z pisaniem skryptu upuszczania jest dobrym powodem, aby tego uniknąć.

Jeśli nie wydają się być problemy z opuszczenie bazy mogę ich ponownego niektóre z linkami i dodaj kolejną odpowiedź

+0

Zdecydowanie zgadzam się z tobą na temat braku kaskady schematu upuszczania. Ta odpowiedź przekonała mnie do zatrzymania wyszukiwania i po prostu wyczyściła całą bazę danych. – flodin

+0

@flodin tak poczułem się trochę źle na początku, ale od tamtej pory nie oglądałem się za siebie. To nie jest kosztowna operacja, aby zburzyć i utworzyć nowe bazy danych w serwerze sql. Cieszę się, że pomogłem! –