2009-04-03 13 views
12

Jakie są najlepsze praktyki dla zapewnienia, że ​​Twój SQL może być uruchamiany wielokrotnie bez otrzymywania błędów w kolejnych uruchomieniach?Ponownie uruchamiane skrypty SQL Server

np.

  • sprawdzeniu, że tabele nie istnieją już przed stworzeniem im
  • sprawdzeniu, że kolumny nie istnieją już przed utworzeniem lub zmianą nazwy
  • z wycofania transakcji w przypadku błędu
  • Jeśli spadek tabel, które istnieją przed tworząc je od nowa, najpierw upuść ich zależności, i nie zapomnij odtworzyć ich po użyciu
  • Używanie CREATE LUB ALTER PROCEDURE zamiast CREATE PROCEDURE lub ALTER PROCEDURE, jeśli twój smak SQL obsługuje to
  • Utrzymanie wewnętrznego schematu wersjonowania, więc ten sam SQL po prostu nie jest uruchamiany dwa razy w pierwszej kolejności. W ten sposób zawsze wiesz, gdzie jesteś, patrząc na numer wersji.
  • Wyeksportuj istniejące dane do instrukcji INSERT i całkowicie odtwórz cały DB od podstaw.

  • upuszczanie tabel przed ich tworzenia (nie najbezpieczniejszą rzeczą kiedykolwiek, ale będzie działać w kropce, jeśli wiesz co robisz)

edit: Szukałem czegoś takiego:

IF EXISTS (SELECT * 
      FROM sys.objects 
      WHERE object_id = OBJECT_ID(N'[dbo].[foo]') 
        AND OBJECTPROPERTY(object_id, N'IsUserTable') = 1) 
DROP TABLE foo 

Czy inni używają takich stwierdzeń lub czegoś lepszego?

edit: Lubię JHONNY za sugestię:

IF OBJECT_ID('table_name') IS NOT NULL DROP TABLE table_name 

Robię to dla kolumn dodając:

IF NOT EXISTS (SELECT * 
       FROM SYSCOLUMNS sc 
       WHERE EXISTS (SELECT id 
           FROM [dbo].[sysobjects] 
           WHERE NAME LIKE 'TableName' 
             AND sc.id = id) 
         AND sc.name = 'ColumnName') 
    ALTER TABLE [dbo].[TableName] ADD [ColumnName] 
+0

bym usunąć upuszczanie tabel przed ich tworzenia. Nie chcesz upuszczać tabel z danymi! –

+0

Zgoda, prawdopodobnie nie jest to najbezpieczniejsze. Próbowałem po prostu włączyć piłkę do tego rodzaju reakcji, których szukałem. –

Odpowiedz

0

Do utrzymywania schematów, spojrzeć na narzędzia migracji. Myślę, że LiquiBase działałoby dla SQL Server.

4

Aby dodać do swojej listy:

  • Jeśli spadek tabel, które istnieją przed utworzeniem je na nowo, spadek ich zależności pierwszy też, i nie zapomnij, aby odtworzyć je po
  • Korzystanie CREATE OR ALTER PROCEDURE zamiast CREATE PROCEDURE lub ALTER PROCEDURE jeśli smak SQL obsługuje

Ale ostatecznie, chciałbym przejść z jednego z następujących powodów:

  • Utrzymanie wewnętrznego schematu wersjonowania, więc ten sam SQL, po prostu , nie będzie, aby uruchomić dwukrotnie pierwsze. W ten sposób zawsze wiesz, gdzie jesteś, patrząc na numer wersji.
  • Wyeksportuj istniejące dane do instrukcji INSERT i całkowicie odtwórz całe DB od podstaw.
+0

Dobra wskazówka, z wewnętrznym schematem wersjonowania – SQueek

0

Należy również sprawdzić klucze obce na tabelach, które można upuścić/ponownie utworzyć. Weź również pod uwagę wszelkie zmiany danych, które możesz wprowadzić - usuń wiersze przed próbą wstawienia po raz drugi, itp.

Możesz także chcieć wprowadzić kod, aby sprawdzić dane przed usunięciem tabel jako zabezpieczenie, aby nie t tabele kropli, które są już używane.

5

Myślę, że najważniejszą praktyką w zapewnianiu ponownego uruchamiania skryptów jest ... ich uruchamianie w testowej bazie danych wiele razy po wszelkich zmianach w skrypcie. Błędy, które napotkasz, powinny kształtować twoje praktyki.

EDIT

W odpowiedzi na Państwa zmienił składni, w ogóle myślę, że najlepiej jest unikać tabele systemowe na rzecz widoków systemowych np

if exists(Select 1 from information_schema.tables where table_name = 'sometable') 
    drop sometable 
go 
if exists(Select 1 from information_schema.routines where 
specific_name = 'someproc') 
    drop someproc 
0

dla instrukcji SQL partii, można wydać

To tylko FYI, tylko prowadził ją 10 razy

IF EXISTS (SELECT * 
      FROM sys.objects 
      WHERE object_id = OBJECT_ID(N'[dbo].[foo]') 
        AND OBJECTPROPERTY(object_id, N'IsUserTable') = 1) 
DROP TABLE foo 


GO 10 -- run the batch 10 times 

To tylko FYI, tylko prowadził ją 10 czasy

Początek pętli wykonanie Batch

wykonanie zakończone 10 razy.

3

Niedawno znalazłem Zameldowanie w istnieniu, że nie wiedział istniał i podobało mi się to, bo to krótsze

IF OBJECT_ID('table_name') IS NOT NULL DROP TABLE table_name 

przed, ja używałem

IF EXISTS (SELECT * FROM information_schema.tables WHERE table_name = 'table_name') 
DROP TABLE table_name 

Która znalazłem przydatny, ponieważ jest trochę bardziej przenośny (MySql, Postgres, itp.), biorąc pod uwagę różnice, oczywiście

3

Aby wszystko było łatwiejsze ier skonfigurować Management Studio do skryptu obiektów jak rerunnable

  1. Narzędzia
  2. Opcje
  3. SQL Server Object Explorer
  4. skryptów
  5. opcje skryptów obiektu
  6. Dołącz IF NOT EXISTS klauzuli Prawdziwa
0

"IF OBJECT_ID (" table_name "," U ") NIE JEST NULL" Składnia jest dobra, może być również używana do procedur: JEŚLI OBJECT_ID ("nazwa proc.", "P") NIE JEST NIŻEJ ...

... i wyzwalacze, widoki itp. ... Prawdopodobnie dobrą praktyką jest określenie typu (U dla tabeli, P dla progu itd.nie zapamiętaj dokładnych liter dla wszystkich typów) w przypadku, gdy twoje nomenklatury pozwalają na stosowanie procedur i tabel o podobnych nazwach ...

Co więcej, dobrym pomysłem może być stworzenie własnych procedur, które zmieniają tabele, z obsługą błędów twoje środowisko. Na przykład:

  • prcTableDrop, Proc dla droping do tabeli
  • prcTableColumnAdd, Proc za dodanie kolumny do tabeli
  • prcTableColumnRename, masz pomysł
  • prcTableIndexCreate

takich procs sprawia, że ​​tworzenie powtarzalnych (w tym samym lub innym db) skryptów zmian jest znacznie łatwiejsze.

/B