Necromancing.
Saya berasumsi ketika seseorang mendarat di sini, dia membutuhkan kunci asing ke kolom dalam tabel yang berisi kunci non-unik.
Masalahnya adalah, jika Anda memiliki masalah itu, skema database didenormalisasi.
Anda misalnya menyimpan ruangan dalam sebuah meja, dengan kunci utama kamar-uid, bidang DateFrom dan DateTo, dan uid lain, di sini RM_ApertureID untuk melacak ruangan yang sama, dan bidang hapus lembut, seperti RM_Status, dimana 99 berarti 'dihapus', dan <> 99 berarti 'aktif'.
Jadi saat Anda membuat ruang pertama, Anda memasukkan RM_UID dan RM_ApertureID sebagai nilai yang sama dengan RM_UID. Kemudian, saat Anda menghentikan ruangan ke tanggal, dan membuatnya kembali dengan rentang tanggal baru, RM_UID adalah newid (), dan RM_ApertureID dari entri sebelumnya menjadi RM_ApertureID baru.
Jadi, jika demikian, RM_ApertureID adalah bidang non-unik, sehingga Anda tidak dapat menyetel kunci asing di tabel lain.
Dan tidak ada cara untuk menyetel kunci asing ke kolom / indeks non-unik, misalnya di T_ZO_REM_AP_Raum_Reinigung (DI MANA RM_UID sebenarnya adalah RM_ApertureID).
Tetapi untuk melarang nilai yang tidak valid, Anda perlu menyetel kunci asing, jika tidak, data-sampah adalah hasilnya lebih cepat daripada nanti ...
Sekarang yang dapat Anda lakukan dalam kasus ini (singkatnya menulis ulang seluruh aplikasi) adalah memasukkan batasan PERIKSA, dengan fungsi skalar memeriksa keberadaan kunci:
IF EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[Check_RM_ApertureIDisValid_T_ZO_REM_AP_Raum_Reinigung]') AND parent_object_id = OBJECT_ID(N'[dbo].[T_ZO_REM_AP_Raum_Reinigung]'))
ALTER TABLE dbo.T_ZO_REM_AP_Raum_Reinigung DROP CONSTRAINT [Check_RM_ApertureIDisValid_T_ZO_REM_AP_Raum_Reinigung]
GO
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[fu_Constaint_ValidRmApertureId]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [dbo].[fu_Constaint_ValidRmApertureId]
GO
CREATE FUNCTION [dbo].[fu_Constaint_ValidRmApertureId](
@in_RM_ApertureID uniqueidentifier
,@in_DatumVon AS datetime
,@in_DatumBis AS datetime
,@in_Status AS integer
)
RETURNS bit
AS
BEGIN
DECLARE @bNoCheckForThisCustomer AS bit
DECLARE @bIsInvalidValue AS bit
SET @bNoCheckForThisCustomer = 'false'
SET @bIsInvalidValue = 'false'
IF @in_Status = 99
RETURN 'false'
IF @in_DatumVon > @in_DatumBis
BEGIN
RETURN 'true'
END
IF @bNoCheckForThisCustomer = 'true'
RETURN @bIsInvalidValue
IF NOT EXISTS
(
SELECT
T_Raum.RM_UID
,T_Raum.RM_Status
,T_Raum.RM_DatumVon
,T_Raum.RM_DatumBis
,T_Raum.RM_ApertureID
FROM T_Raum
WHERE (1=1)
AND T_Raum.RM_ApertureID = @in_RM_ApertureID
AND @in_DatumVon >= T_Raum.RM_DatumVon
AND @in_DatumBis <= T_Raum.RM_DatumBis
AND T_Raum.RM_Status <> 99
)
SET @bIsInvalidValue = 'true'
RETURN @bIsInvalidValue
END
GO
IF EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[Check_RM_ApertureIDisValid_T_ZO_REM_AP_Raum_Reinigung]') AND parent_object_id = OBJECT_ID(N'[dbo].[T_ZO_REM_AP_Raum_Reinigung]'))
ALTER TABLE dbo.T_ZO_REM_AP_Raum_Reinigung DROP CONSTRAINT [Check_RM_ApertureIDisValid_T_ZO_REM_AP_Raum_Reinigung]
GO
ALTER TABLE dbo.T_ZO_REM_AP_Raum_Reinigung WITH NOCHECK ADD CONSTRAINT [Check_RM_ApertureIDisValid_T_ZO_REM_AP_Raum_Reinigung]
CHECK
(
NOT
(
dbo.fu_Constaint_ValidRmApertureId(ZO_RMREM_RM_UID, ZO_RMREM_GueltigVon, ZO_RMREM_GueltigBis, ZO_RMREM_Status) = 1
)
)
GO
IF EXISTS (SELECT * FROM sys.check_constraints WHERE object_id = OBJECT_ID(N'[dbo].[Check_RM_ApertureIDisValid_T_ZO_REM_AP_Raum_Reinigung]') AND parent_object_id = OBJECT_ID(N'[dbo].[T_ZO_REM_AP_Raum_Reinigung]'))
ALTER TABLE dbo.T_ZO_REM_AP_Raum_Reinigung CHECK CONSTRAINT [Check_RM_ApertureIDisValid_T_ZO_REM_AP_Raum_Reinigung]
GO
table1.ID?