Saya perlu menghapus tabel yang sangat direferensikan dalam database SQL Server. Bagaimana saya bisa mendapatkan daftar semua batasan kunci asing yang perlu saya hapus untuk menjatuhkan tabel?
(SQL menjawab lebih baik daripada mengklik di GUI studio manajemen.)
sql
sql-server
tsql
chillitom
sumber
sumber
Jawaban:
Tidak yakin mengapa tidak ada yang menyarankan tetapi saya gunakan
sp_fkeys
untuk menanyakan kunci asing untuk tabel yang diberikan:Anda juga dapat menentukan skema:
Tanpa menentukan skema, dokumen menyatakan sebagai berikut:
sumber
Saya akan menggunakan fitur Database Diagramming di SQL Server Management Studio, tetapi karena Anda mengesampingkannya - ini bekerja untuk saya di SQL Server 2008 (tidak punya 2005).
Untuk mendapatkan daftar nama tabel dan kolom referensi ...
Untuk mendapatkan nama batasan kunci asing
sumber
Ini memberi Anda:
Kode di bawah ini:
sumber
order by
: KeyTableSchemaName, KeyTableName, KeyColNameName, FkTableSchemaName, FkTableName, FkName, dan f) ubah urutan Kolom ke: KeyTableSchemaName, KeyTableName, KeyColNameName, FkTableSchemaName, FkTame / FkTotal, a konvensi dan d / e untuk penggunaan yang paling mungkin (daftar tanggungan FK aTable
).Coba ini :
sumber
Anda juga harus memikirkan referensi ke objek lain.
Jika tabel sangat dirujuk oleh tabel lain selain itu mungkin juga sangat direferensikan oleh objek lain seperti tampilan, prosedur tersimpan, fungsi dan banyak lagi.
Saya sangat merekomendasikan alat GUI seperti dialog 'lihat dependensi' di SSMS atau alat gratis seperti ApexSQL Search untuk ini karena mencari dependensi pada objek lain dapat menjadi rawan kesalahan jika Anda ingin melakukannya hanya dengan SQL.
Jika SQL adalah satu-satunya opsi yang dapat Anda coba lakukan seperti ini.
sumber
Pertanyaan awal diminta untuk memasukkan daftar semua kunci asing ke dalam tabel yang sangat direferensikan sehingga tabel tersebut dapat dihapus.
Kueri kecil ini mengembalikan semua perintah 'jatuhkan kunci asing' yang diperlukan untuk memasukkan semua kunci asing ke dalam tabel tertentu:
Contoh output:
Hapus klausa WHERE-untuk mendapatkan perintah drop untuk semua kunci asing di database saat ini.
sumber
Inilah kode SQL yang akan saya gunakan.
Ini tidak terlalu jelas SQL, jadi mari kita lihat sebuah contoh.
Jadi, seandainya saya ingin menjatuhkan
Employees
tabel dalamNorthwind
database tercinta Microsoft , tetapi SQL Server mengatakan kepada saya bahwa satu atau lebih Kunci Asing mencegah saya melakukan ini.Perintah SQL di atas akan mengembalikan hasil ini ...
Ini menunjukkan kepada saya bahwa ada 3 Kunci Asing yang merujuk
Employees
tabel. Dengan kata lain, saya tidak akan diizinkan untuk menghapus (drop) tabel ini sampai ketiga Kunci Asing ini pertama kali dihapus.Dalam hasil, baris pertama adalah bagaimana batasan Kunci Asing berikut akan ditampilkan dalam hasil.
Kolom kedua ke terakhir menunjukkan perintah SQL yang saya perlukan untuk menghapus salah satu kunci asing ini, misalnya:
... dan kolom sebelah kanan menunjukkan SQL untuk membuatnya ...
Dengan semua perintah ini, Anda memiliki semua yang Anda butuhkan untuk menghapus Kunci Asing yang relevan untuk memungkinkan Anda menghapus tabel, kemudian membuatnya kembali nanti.
Fiuh. Semoga ini membantu.
sumber
sumber
Yang paling sederhana adalah dengan menggunakan sys.foreign_keys_columns dalam SQL. Di sini tabel berisi id Objek dari semua kunci asing yang menggunakan ID kolom yang direferensikan, ID Tabel yang Dirujuk serta Kolom dan Tabel Referensi. Karena Id tetap konstan, hasilnya akan dapat diandalkan untuk modifikasi lebih lanjut dalam Skema dan juga tabel.
Pertanyaan:
Kami juga dapat menambahkan filter dengan menggunakan 'di mana'
sumber
sumber
Saya menggunakan skrip ini untuk menemukan semua detail yang terkait dengan kunci asing. Saya menggunakan INFORMATION.SCHEMA. Di bawah ini adalah Skrip SQL:
sumber
Pertama
Kemudian gunakan NimbleText untuk bermain dengan hasil Anda
sumber
Beberapa jawaban bagus di atas. Tapi saya lebih suka memiliki jawaban dengan satu permintaan. Bagian kode ini diambil dari sys.sp_helpconstraint (sys proc)
Itulah cara Microsoft mencari jika ada kunci asing yang terkait dengan tbl.
Jawabannya akan terlihat seperti ini: test_db_name.dbo.Account: FK_Account_Customer
sumber
select db_name() + '.' + schema_name(ObjectProperty(parent_object_id,'schemaid')) + '.' + object_name(parent_object_id) + ': ' + object_name(object_id) AS "FK Reference" from sys.foreign_keys where referenced_object_id = object_id('Customer')
Jika Anda ingin mendapatkan hubungan kunci asing dari semua tabel mengecualikan
where
klausa lain menulis tablename Anda, bukantablename
sumber
Ini hanya menunjukkan hubungan jika kendala kunci asing. Database saya tampaknya mendahului kendala FK. Beberapa tabel menggunakan pemicu untuk menegakkan integritas referensial, dan kadang-kadang tidak ada yang lain kecuali kolom yang sama namanya untuk menunjukkan hubungan (dan tidak ada integritas referensial sama sekali).
Untungnya, kami memiliki adegan penamaan yang konsisten sehingga saya dapat menemukan tabel referensi dan tampilan seperti ini:
Saya menggunakan pilih ini sebagai dasar untuk menghasilkan skrip yang melakukan apa yang perlu saya lakukan pada tabel terkait.
sumber
Bekerja dari apa yang dilakukan @Gishu, saya dapat membuat dan menggunakan SQL berikut di SQL Server 2005
Yang menampilkan tabel, kolom, dan nama kunci asing semua dalam 1 permintaan.
sumber
Menentukan kunci primer dan kunci unik untuk semua tabel dalam database ...
Ini harus mencantumkan semua kendala dan pada akhirnya Anda dapat menempatkan filter Anda
Untuk referensi, silakan baca - http://blogs.msdn.com/b/sqltips/archive/2005/09/16/469136.aspx
sumber
Saya telah menggunakan ini pada 2008 ke atas. Ini mirip dengan beberapa solusi lain yang terdaftar, tetapi, nama bidangnya cocok untuk menangani kumpulan kasus spesifik (LatBin). Selain itu, Anda bisa memberinya satu nama tabel dan mengambil hanya info untuk tabel itu.
sumber
Ada cara menghitung semua tanggung jawab untuk Id yang dipilih. Ubah saja nilai @dbTableName, nilai @dbRowId dan jenisnya (jika int Anda perlu menghapus '' pada baris no 82 (..SET @SQL = ..)). Nikmati.
sumber
Server Mysql memiliki
information_schema.REFERENTIAL_CONSTRAINTS
tabel FYI, Anda dapat memfilternya berdasarkan nama tabel atau nama tabel yang direferensikan.sumber
Daftar semua kunci asing referensi tabel yang diberikan dalam SQL Server:
Anda bisa mendapatkan nama tabel referensi dan nama kolom melalui kueri berikut ...
Dan screenshot berikut untuk pengertian Anda ...
sumber
Ini mendapatkan kunci asing apa pun yang melibatkan tabel yang dipilih. * Mengasumsikan format _FIRSTABLENAME_SECONDTABLENAME.
Ini adalah bentuk yang lebih umum:
sumber
Solusi berikut ini berfungsi untuk saya:
sumber
Anda dapat menemukan melalui kueri di bawah ini:
sumber
Juga coba.
dengan
sp_fkeys
Anda dapat memfilter hasilnya dengan tidak hanya nama dan skema tabel pk tetapi juga dengan nama dan skema tabel fk. tautansumber
Jawaban yang paling disukai oleh @BankZ
tambahan untuk skema yang berbeda
sumber