Apakah menonaktifkan dan mengaktifkan batasan kunci asing didukung di SQL Server? Atau satunya pilihan saya untuk drop
kemudian kembalicreate
kendala?
824
Apakah menonaktifkan dan mengaktifkan batasan kunci asing didukung di SQL Server? Atau satunya pilihan saya untuk drop
kemudian kembalicreate
kendala?
Jawaban:
Jika Anda ingin menonaktifkan semua kendala dalam database, jalankan saja kode ini:
Untuk mengaktifkannya kembali, jalankan: (cetak adalah opsional tentu saja dan itu hanya daftar tabel)
Saya merasa berguna saat mengisi data dari satu basis data ke basis data lainnya. Ini adalah pendekatan yang jauh lebih baik daripada menjatuhkan batasan. Seperti yang Anda sebutkan itu berguna ketika menjatuhkan semua data dalam database dan mengisi kembali itu (katakanlah di lingkungan pengujian).
Jika Anda menghapus semua data, Anda mungkin menemukan solusi ini sangat membantu.
Terkadang juga berguna untuk menonaktifkan semua pemicu, Anda dapat melihat solusi lengkapnya di sini .
sumber
"ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"
Haruskah hanya ada satu "PERIKSA" di sana?http://www.sqljunkies.com/WebLog/roman/archive/2005/01/30/7037.aspx
sumber
Untuk menonaktifkan batasan Anda memiliki
ALTER
tabel menggunakan NOCHECKUntuk memungkinkan Anda harus menggunakan LIHAT ganda :
Setelah selesai, jika Anda perlu memeriksa statusnya, gunakan skrip ini untuk mendaftar status kendala. Akan sangat membantu:
sumber
sys.sysforeignkeys
msdn.microsoft.com/en-us/library/ms177604.aspxPilihan terbaik Anda adalah MENGURANGI dan MENCIPTAKAN batasan kunci asing.
Saya tidak menemukan contoh di pos ini yang akan berfungsi untuk saya "apa adanya", yang satu tidak akan berfungsi jika kunci asing merujuk skema yang berbeda, yang lain tidak akan berfungsi jika kunci asing merujuk beberapa kolom. Skrip ini mempertimbangkan baik, beberapa skema dan beberapa kolom per kunci asing.
Berikut ini skrip yang menghasilkan pernyataan "ADD CONSTRAINT", untuk beberapa kolom ia akan memisahkannya dengan koma ( pastikan untuk menyimpan hasil ini sebelum menjalankan pernyataan DROP ):
Berikut ini skrip yang menghasilkan pernyataan "DROP CONSTRAINT":
sumber
Standar SQL-92 memungkinkan untuk pengekang untuk dinyatakan sebagai DAPAT DITERIMA sehingga dapat ditunda (secara implisit atau eksplisit) dalam lingkup transaksi. Sayangnya, SQL Server masih kehilangan fungsionalitas SQL-92 ini.
Bagi saya, mengubah batasan untuk NOCHECK sama dengan mengubah struktur database dengan cepat - menjatuhkan batasan tentu saja - dan sesuatu yang harus dihindari (misalnya pengguna memerlukan peningkatan hak istimewa).
sumber
Saya setuju dengan Anda, Hamlin. Ketika Anda mentransfer data menggunakan SSIS atau ketika ingin mereplikasi data, tampaknya cukup perlu untuk sementara menonaktifkan atau menghapus batasan kunci asing dan kemudian mengaktifkan kembali atau membuat ulang mereka. Dalam kasus ini, integritas referensial bukan merupakan masalah, karena sudah dipelihara dalam database sumber. Karena itu, Anda dapat yakin tentang masalah ini.
sumber
sumber
WITH CHECK CHECK
hampir pasti diperlukan!Poin ini dimunculkan dalam beberapa jawaban dan komentar tetapi saya merasa cukup penting untuk menyebutnya lagi.
Mengaktifkan kembali kendala menggunakan perintah berikut (tidak
WITH CHECK
) akan memiliki beberapa kelemahan serius .Catatan: DENGAN NOCHECK adalah standar untuk kendala yang mengaktifkan kembali. Saya harus bertanya-tanya mengapa ...
The sys.foreign_keys tampilan sistem menyediakan beberapa visibilitas ke masalah ini. Perhatikan bahwa ia memiliki kolom
is_disabled
an danis_not_trusted
.is_disabled
menunjukkan apakah operasi manipulasi data di masa depan akan divalidasi terhadap kendala.is_not_trusted
menunjukkan apakah semua data saat ini dalam tabel telah divalidasi terhadap kendala.Apakah kendala Anda bisa dipercaya? Temukan...
sumber
Pos pertama :)
Untuk OP, solusi kristof akan bekerja, kecuali ada masalah dengan data besar-besaran dan masalah balon transaksi pada penghapusan besar. Juga, bahkan dengan penyimpanan tlog untuk cadangan, karena menghapus menulis ke tlog, operasi dapat memakan waktu SANGAT lama untuk tabel dengan ratusan juta baris.
Saya menggunakan serangkaian kursor untuk memotong dan memuat ulang salinan besar dari salah satu basis data produksi kami yang besar. Akun yang direkayasa solusi untuk beberapa skema, beberapa kolom kunci asing, dan yang terbaik dari semuanya dapat digunakan untuk digunakan dalam SSIS.
Ini melibatkan pembuatan tiga tabel pementasan (tabel nyata) untuk menampung DROP, CREATE, dan PERIKSA skrip FK, pembuatan dan penyisipan skrip tersebut ke dalam tabel, dan kemudian pengulangan di atas tabel dan menjalankannya. Skrip terlampir adalah empat bagian: 1.) pembuatan dan penyimpanan skrip dalam tiga tabel (nyata) staging, 2.) pelaksanaan skrip drop FK melalui kursor satu per satu, 3.) Menggunakan sp_MSselalu dapat digunakan untuk memotong semua skrip tabel dalam database selain dari tiga tabel pementasan kami dan 4.) pelaksanaan pembuatan FK dan periksa skrip FK di akhir paket ETL SSIS Anda.
Jalankan bagian pembuatan skrip dalam tugas Jalankan SQL di SSIS. Jalankan bagian "eksekusi Drop FK Scripts" di tugas kedua Jalankan SQL. Letakkan skrip pemotongan dalam tugas ketiga Jalankan SQL, kemudian lakukan proses ETL lain yang perlu Anda lakukan sebelum melampirkan skrip CREATE dan PERIKSA dalam tugas akhir Jalankan SQL (atau dua jika diinginkan) di akhir alur kontrol Anda.
Penyimpanan skrip di tabel nyata telah terbukti sangat berharga ketika aplikasi ulang kunci asing gagal karena Anda dapat memilih * dari sync_CreateFK, salin / tempel ke jendela kueri Anda, jalankan satu per satu, dan perbaiki masalah data begitu Anda temukan yang gagal / masih gagal mendaftar ulang.
Jangan menjalankan kembali skrip jika gagal tanpa memastikan bahwa Anda menerapkan kembali semua kunci asing / pemeriksaan sebelum melakukannya, atau Anda kemungkinan besar akan kehilangan beberapa kreasi dan memeriksa skrip fk karena tabel pementasan kami dihapus dan diciptakan kembali sebelum pembuatan skrip untuk dieksekusi.
sumber
Temukan batasannya
Jalankan SQL yang dihasilkan oleh SQL ini
Jalan aman.
Catatan: Menambahkan solusi untuk menjatuhkan batasan sehingga tabel dapat dijatuhkan atau dimodifikasi tanpa kesalahan kendala.
sumber
Klik kanan desain tabel dan pergi ke Hubungan dan pilih kunci asing di panel sisi kiri dan di panel sisi kanan, atur Terapkan batasan kunci asing ke 'Ya' (untuk mengaktifkan batasan kunci asing) atau 'Tidak' (untuk nonaktifkan).
sumber
Jawaban bertanda '905' terlihat bagus tetapi tidak berfungsi.
Mengikuti berhasil bagi saya. Kunci Utama, Kunci Unik, atau batasan Default TIDAK DAPAT dinonaktifkan. Bahkan, jika 'sp_helpconstraint' 'menunjukkan' n / a 'di status_enabled - Berarti itu TIDAK dapat diaktifkan / dinonaktifkan.
- Untuk menghasilkan skrip ke DISABLE
- Untuk menghasilkan skrip ke AKTIFKAN
sumber
Anda sebenarnya harus dapat menonaktifkan batasan kunci asing dengan cara yang sama Anda menonaktifkan sementara kendala lain:
Pastikan Anda menonaktifkan batasan pada tabel pertama yang tercantum dalam nama kendala. Misalnya, jika batasan kunci asing saya adalah FK_LocationsEmployeesLocationIdEmployeeId, saya ingin menggunakan yang berikut:
meskipun melanggar batasan ini akan menghasilkan kesalahan yang tidak selalu menyatakan tabel itu sebagai sumber konflik.
sumber
Satu skrip untuk mengatur semuanya: ini menggabungkan perintah truncate dan delete dengan sp_MSforeachtable sehingga Anda dapat menghindari menjatuhkan dan menciptakan kembali kendala - cukup tentukan tabel yang perlu dihapus daripada terpotong dan untuk tujuan saya, saya telah menyertakan filter skema tambahan untuk selamanya mengukur (diuji pada 2008r2)
sumber
Anda dapat menonaktifkan sementara kendala pada tabel Anda, melakukan pekerjaan, lalu membangunnya kembali.
Berikut ini cara mudah untuk melakukannya ...
Nonaktifkan semua indeks, termasuk kunci utama, yang akan menonaktifkan semua kunci asing, lalu aktifkan kembali hanya kunci utama sehingga Anda dapat bekerja dengannya ...
[Lakukan sesuatu, seperti memuat data]
Kemudian aktifkan kembali dan bangun kembali indeks ...
sumber
@sql
selalu terpotong. :(Saya memiliki versi yang lebih bermanfaat jika Anda tertarik. Saya mengangkat sedikit kode dari sini situs web di mana tautannya tidak lagi aktif. Saya memodifikasinya untuk memungkinkan array tabel ke dalam prosedur tersimpan dan mengisi drop, truncate, tambahkan pernyataan sebelum menjalankan semuanya. Ini memberi Anda kendali untuk memutuskan tabel mana yang perlu dipotong.
sumber