Sebagai bagian dari proses pembangunan kami, kami menjalankan skrip pembaruan basis data saat kami menerapkan kode ke 4 lingkungan berbeda. Selanjutnya, karena permintaan yang sama akan ditambahkan ke sampai kita menjatuhkan sebuah rilis ke dalam produksi itu memiliki untuk dapat menjalankan beberapa kali pada database yang diberikan. Seperti ini:
IF NOT EXISTS (SELECT * FROM sys.tables WHERE object_id = OBJECT_ID(N'[Table]'))
BEGIN
CREATE TABLE [Table]
(...)
END
Saat ini saya memiliki membuat pernyataan skema dalam skrip penerapan / pembuatan. Di mana saya menanyakan keberadaan skema?
sql-server-2005
schema
Pulsehead
sumber
sumber
Jawaban:
Apakah Anda mencari sys.schemas ?
Perhatikan bahwa
CREATE SCHEMA
harus dijalankan dalam batch-nya sendiri (sesuai jawaban di bawah )sumber
SELECT 1/0...
@bdukes tepat untuk menentukan apakah skema tersebut ada, tetapi pernyataan di atas tidak akan berfungsi di SQL Server 2005.
CREATE SCHEMA <name>
perlu dijalankan dalam kelompoknya sendiri. Solusinya adalah dengan mengeksekusiCREATE SCHEMA
pernyataan dalam sebuah exec.Inilah yang saya gunakan dalam skrip build saya:
sumber
Ini sudah tua jadi saya merasa harus menambahkan: Untuk SQL SERVER 2008+ Ini semua berfungsi (untuk bagian yang dipilih), kemudian gunakan
EXECUTE('CREATE SCHEMA <name>')
untuk benar-benar membuatnya pada hasil negatif.sumber
IF schema_id ('MySchemaName') IS NULL
berfungsi dengan baik, dan tampaknya sedikit lebih nyaman daripada jawaban yang diterima.Hanya untuk menjadi ekstra "defensif", versi berikut menghasilkan kesalahan konversi Jenis untuk memperhitungkan kemungkinan (namun tidak mungkin)> 1 pencocokan
Schema
mirip dengan bagaimana kode validasi sering kali sengaja Lempar Pengecualian karena saya yakin itu baik untuk dan saya percaya itu "'Praktik terbaik'" untuk memperhitungkan semua kemungkinan hasil pengembalian namun tidak mungkin dan bahkan jika itu hanya untuk menghasilkan pengecualian fatal karena efek penghentian pemrosesan yang diketahui biasanya lebih baik daripada efek berjenjang yang tidak diketahui dari kesalahan yang tidak terperangkap. Karena sangat tidak mungkin, menurut saya tidak ada gunanya melakukanCount
pemeriksaan terpisah +Throw
atauTry
-Catch
-Throw
untuk menghasilkan kesalahan fatal yang lebih ramah pengguna tetapi tetap saja kesalahan fatal.SS 2005-:
SS 2008+:
Kemudian:
sumber
Throw
Exception
. Seperti yang Anda katakan, itu tidak "'mungkin'" terjadi, jadi IMHO, itu tidak layak secara keseluruhanTry
-Catch
atauCount
pemeriksaan terpisah untuk menghasilkan kesalahan fatal yang lebih ramah pengguna, tetapi terlepas dari itu, saya kemungkinan besar menginginkan kesalahan fatal. Saya percaya dan saya percaya itu "'praktik terbaik'" untuk memperhitungkan semua kemungkinan hasil pengembalian namun tidak mungkin dan bahkan jika itu hanya untuk menghasilkan pengecualian fatal karena efek yang diketahui dari menghentikan pemrosesan biasanya lebih baik daripada efek berjenjang yang tidak diketahui dari tidak terperangkap kesalahan.Select
,Insert
,Update
atauDelete
Pernyataan kembali / mempengaruhi lebih atau kurang dari yang diharapkan # dari Rows namun tidak mungkin. Meskipun saat ini ada (ada) yangUnique
Index
memastikan # (yaitu 1) dari Baris yang diharapkan dikembalikan / terpengaruh, hal itu dapat berubah (secara tidak sengaja atau (secara tidak sengaja) "'sengaja'") di masa mendatang.Jika tata letak komponen memungkinkan, ini juga berfungsi.
sumber