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.
sumber
Jawaban:
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 PROCEDURE
tanpa apa-apa di dalamnya, kemudian jalankan sisa skrip Anda, kemudian jalankan sebuahALTER PROCEDURE
yang 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.
sumber
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)
sumber