Bagaimana saya bisa mendapatkan semua catatan anak yatim dalam satu permintaan?


8

Saya hanya melihat beberapa tabel yang memiliki catatan yatim (kunci asing) yang tidak lagi mengarah ke kunci primer apa pun. Bagaimana saya bisa meminta tabel untuk mendapatkan daftar semua baris seperti itu? Kapan catatan orang tua ini dihapus atau bagaimana mengatasinya?

Saya menggunakan SQL Server 2008 R2 dan kami mencoba mengimpor 3 database serupa ke dalam satu setelah membersihkannya, mohon saran.

Membuat skrip tabel sampel anak (DocumentDistribution) dan tabel induk (DocumentSource):

ALTER TABLE [dbo].[DocumentDistribution] WITH NOCHECK ADD CONSTRAINT [fk_documentdistsourceid_documentsourceid] FOREIGN KEY([DocumentDistSourceID]) REFERENCES [dbo].[DocumentSource] ([DocumentSourceID]) 
GO
 ALTER TABLE [dbo].[DocumentDistribution] CHECK CONSTRAINT [fk_documentdistsourceid_documentsourceid] 

Bukankah itu memberitahu saya bahwa tabel dalam hubungan dan secara eksplisit mendefinisikan batasan kunci asing?

Jawaban:


20

Ini seharusnya hanya mungkin jika Anda memiliki hubungan antara tabel yang Anda ketahui tetapi SQL Server tidak.

SELECT fk 
  FROM dbo.ChildTable AS c
  WHERE NOT EXISTS
  (
    SELECT pk FROM dbo.ParentTable AS p
    WHERE p.pk = c.fk
  );

Sekarang, di masa depan, tentukan hubungan ini secara eksplisit, maka orang tidak akan dapat menghapus baris induk sementara baris anak masih ada. Untuk menghapus baris yang seharusnya tidak ada hari ini:

DELETE c
  FROM dbo.ChildTable AS c
  WHERE NOT EXISTS
  (
    SELECT pk FROM dbo.ParentTable AS p
    WHERE p.pk = c.fk
  );

Selanjutnya, ambil hak mereka untuk menonaktifkan kendala ini sehingga mereka berhenti melakukan ini dengan cara yang salah.


Anda juga dapat melakukan tindakan sebaliknya dengan mengganti tabel anak dan orang tua. Ini akan menghapus semua baris induk yang tidak dirujuk oleh tabel anak - orangtua yatim, jika Anda mau.
djule5
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.