Menonaktifkan Pemeriksaan Skema Fungsi / Pembuatan Prosedur Tersimpan

17

Saya mencoba untuk mengotomatisasi proses yang mengeksekusi perubahan ke database SQL Server 2008 R2. Proses saya menempatkan tetes dan menciptakan kembali prosedur dan fungsi saya yang tersimpan, serta menjalankan skrip untuk mengubah tabel / kolom / data. Sayangnya, salah satu skrip membutuhkan salah satu fungsi untuk ditempatkan terlebih dahulu. Tapi saya tidak bisa menjalankan semua perubahan proc / fungsi yang disimpan terlebih dahulu karena bergantung pada kolom yang ditambahkan dari tabel / kolom / skrip perubahan data terlebih dahulu.

Saya bertanya-tanya apakah mungkin menjalankan prosedur dan fungsi yang tersimpan tanpa SQL Server memvalidasi kolom yang digunakan dalam definisi fungsi / SP? Saya mencoba mencari tetapi tidak dapat menemukan kondisi atau perintah untuk mengaktifkan ini.

Brian Mains
sumber
Sepertinya Anda hanya perlu mengatur ulang pembuatan objek dalam skrip Anda.
Thomas Stringer
@ hiu Ini karena skrip perubahan memerlukan ketergantungan pada fungsi yang ada di sana, yang pada saat itu tidak ... untuk melakukan itu akan memerlukan intervensi manual; Saya menginginkan sesuatu yang lebih otomatis.
Brian Mains

Jawaban:

20

Anda dapat membuat prosedur tersimpan yang mereferensikan objek yang belum ada (misalnya tabel dan fungsi). Anda tidak dapat membuat prosedur tersimpan yang mereferensikan kolom yang belum ada di objek yang sudah ada. Ini adalah pedang bermata dua dari resolusi nama yang ditangguhkan - SQL Server memberi Anda keuntungan dari keraguan dalam beberapa kasus, tetapi tidak semua. Lihat ide Erland untuk SET STRICT_CHECKS ON;mendapatkan beberapa ide tempat ini bekerja dan tempat-tempat yang rusak:

http://www.sommarskog.se/strict_checks.html

(Dan bagaimana dia ingin kebalikan dari apa yang Anda cari - Anda ingin membiarkan apa pun untuk dikompilasi terlepas dari keberadaan, dan dia ingin setiap kolom atau tabel diperiksa.)

Tidak ada pengaturan seperti SET DEFERRED_NAME_RESOLUTION OFF;meskipun telah diminta:

http://connect.microsoft.com/sql/127152

Dan tidak ada pengaturan seperti IGNORE ALL_RESOLUTION;.


Anda bisa menyiasatinya dalam beberapa cara, termasuk:

(a) menggunakan SQL dinamis dalam prosedur tersimpan yang terpengaruh.

(B) membangun sebuah rintisan CREATE PROCEDUREtanpa apa-apa di dalamnya, kemudian jalankan sisa skrip Anda, kemudian jalankan sebuah ALTER PROCEDUREyang memiliki tubuh asli (pada dasarnya, menyebarkan prosedur dalam dua fase).

(C) membuat alat penyebaran Anda lebih pintar tentang urutan operasi. Jika perubahan tabel membutuhkan kehadiran fungsi, skrip perubahan tersebut yang terakhir. Alat perbandingan skema seperti RedGate's SQL Compare cukup bagus untuk menghasilkan skrip untuk Anda dalam urutan ketergantungan yang tepat. Anda tidak menyebutkan alat apa yang Anda gunakan, tetapi jika tidak melakukan ini ...

(d) Martin Smith memiliki solusi yang menarik di sini , tetapi saya belum memainkannya.

Aaron Bertrand
sumber
Wow, retasan Martin Smith itu sangat cerdas. Saya akan merasa kotor menggunakannya sekarang, tetapi di awal 20-an saya akan melakukannya.
John Zabroski
1

Anda dapat membuat prosedur tersimpan yang menghapus atau mengganti nama objek yang dimaksud terlebih dahulu dan kemudian menjalankan prosedur tersimpan asli Anda sebagai SQL dinamis. Dengan cara ini Anda tidak perlu menulis ulang prosedur tersimpan yang sebenarnya untuk menggunakan SQL dinamis.

Kode di bawah ini menjalankan prosedur tersimpan yang mereferensikan kolom yang belum ada (Expense_Super_Compare)

IF OBJECT_ID('Expense_Super_Compare_Results', 'U') IS NOT NULL
BEGIN
     EXEC('DROP TABLE Expense_Super_Compare_Results');
END

exec('exec dbo.Expense_Super_Compare');
Lou Fancy
sumber