W ramach naszego procesu budowania uruchamiamy skrypt aktualizacji bazy danych, wdrażając kod w 4 różnych środowiskach. Co więcej, ponieważ to samo zapytanie zostanie dodane do czasu, gdy upuścimy wydanie do produkcji, musi być w stanie uruchomić wiele razy w danej bazie danych. Lubię to:
IF NOT EXISTS (SELECT * FROM sys.tables WHERE object_id = OBJECT_ID(N'[Table]'))
BEGIN
CREATE TABLE [Table]
(...)
END
Obecnie mam instrukcję tworzenia schematu w skrypcie wdrażania / kompilacji. Gdzie mam zapytać o istnienie schematu?
sql-server-2005
schema
Pulsehead
źródło
źródło
Odpowiedzi:
Szukasz sys.schemas ?
Zauważ, że
CREATE SCHEMA
musi być uruchomiony we własnej partii (zgodnie z odpowiedzią poniżej )źródło
SELECT 1/0...
@bdukes ma rację, jeśli chodzi o pieniądze, aby określić, czy schemat istnieje, ale powyższa instrukcja nie będzie działać w SQL Server 2005.
CREATE SCHEMA <name>
musi działać we własnej partii. Obejściem jest wykonanieCREATE SCHEMA
instrukcji w pliku exec.Oto, czego użyłem w moich skryptach kompilacji:
źródło
To jest stare, więc czuję się zobligowany do dodania: Dla SQL SERVER 2008+ Te wszystkie działają (dla wybranej części), a następnie użyj,
EXECUTE('CREATE SCHEMA <name>')
aby faktycznie utworzyć je na negatywnych wynikach.źródło
IF schema_id ('MySchemaName') IS NULL
działa dobrze i wydaje się nieco wygodniejsza niż zaakceptowana odpowiedź.Wystarczy być dodatkowo „obronny”, dodaje się wersja generuje błąd typu konwersji do konta możliwość (jednak mało prawdopodobne)> 1 dopasowywania
Schema
„s podobny do sposobu kod weryfikacyjny często celowo Rzut Wyjątek s, ponieważ uważam, że dobrze jest i wierzę, że to „Najlepsza praktyka” ”uwzględniająca wszystkie możliwe wyniki zwracania, choć mało prawdopodobne, a nawet jeśli ma to na celu tylko wygenerowanie krytycznego wyjątku, ponieważ znane efekty zatrzymania przetwarzania są zwykle lepsze niż nieznane kaskadowe skutki niezabezpieczonych błędów. Ponieważ jest to wysoce nieprawdopodobne, nie sądziłem, że warto osobnoCount
sprawdzić +Throw
lubTry
-Catch
-Throw
aby wygenerować bardziej przyjazny dla użytkownika błąd krytyczny, ale mimo to błąd krytyczny.SS 2005-:
SS 2008+:
Następnie:
źródło
Throw
Exception
. Jak powiedziałeś, nie jest to „prawdopodobne”, więc IMHO, nie było warte całościTry
-Catch
ani oddzielnegoCount
sprawdzenia, aby wygenerować bardziej przyjazny dla użytkownika błąd krytyczny, ale mimo wszystko prawdopodobnie chciałbym krytycznego błędu. Wierzę w i uważam, że „najlepszą praktyką” jest uwzględnienie wszystkich możliwych wyników zwrotów, choć mało prawdopodobne, a nawet jeśli ma to na celu tylko wygenerowanie krytycznego wyjątku, ponieważ znane efekty zatrzymania przetwarzania są zwykle lepsze niż nieznane efekty kaskadowe braku pułapki błędy.Select
,Insert
,Update
lubDelete
komunikat zwrócony / dotknięte więcej lub mniej niż oczekiwana # wierszy jednak mało prawdopodobne. Nawet jeśli istniejąUnique
Index
obecnie systemy zapewniające oczekiwaną liczbę (tj. 1) wierszy, które mają zostać zwrócone / dotknięte, może to zmienić (przypadkowo lub (krótkowzrocznie) „celowo” ”) w przyszłości.Jeśli pozwala na to układ komponentów, to też działa.
źródło