Necromancing।
मुझे लगता है कि जब कोई व्यक्ति यहां उतरता है, तो उसे एक गैर-विशिष्ट कुंजी वाली तालिका में कॉलम के लिए एक विदेशी कुंजी की आवश्यकता होती है।
समस्या यह है, कि यदि आपके पास वह समस्या है, तो डेटाबेस-स्कीमा को अपभ्रंश किया जाता है।
आप उदाहरण के लिए एक टेबल में कमरे रखने के लिए हैं, एक रूम-यूआईडी प्राइमरी की, एक DateFrom और एक DateTo फ़ील्ड, और दूसरा यूआईडी, यहाँ RM_ApertureID एक ही कमरे का ट्रैक रखने के लिए, और एक सॉफ्ट-डिलीट फ़ील्ड, जैसे RM_Status, जहाँ 99 का अर्थ है 'हटा दिया गया', और <> 99 का अर्थ है 'सक्रिय'।
इसलिए जब आप पहला कमरा बनाते हैं, तो आप RM_UID और RM_UpertureID को RM_UID के समान मान के साथ सम्मिलित करते हैं। फिर, जब आप कमरे को एक तारीख को समाप्त करते हैं, और इसे एक नई तिथि सीमा के साथ फिर से स्थापित करते हैं, तो RM_UID नया है (), और पिछली प्रविष्टि से RM_ApertureID नया RM_ApertureID बन जाता है।
इसलिए, यदि ऐसा है, तो RM_ApertureID एक गैर-विशिष्ट फ़ील्ड है, और इसलिए आप किसी अन्य तालिका में एक विदेशी-कुंजी सेट नहीं कर सकते।
और एक गैर-अद्वितीय कॉलम / इंडेक्स के लिए एक विदेशी कुंजी सेट करने का कोई तरीका नहीं है, उदाहरण के लिए T_ZO_REM_AP_Raum_Reinigung (जहां RM_UID वास्तव में RM_ApertureID है)।
लेकिन अमान्य मूल्यों पर रोक लगाने के लिए, आपको एक विदेशी कुंजी सेट करने की आवश्यकता है, अन्यथा, डेटा-कचरा बाद में के बजाय जल्द ही परिणाम है ...
अब आप इस मामले में क्या कर सकते हैं (पूरे आवेदन को फिर से लिखने में कमी) एक CHECK- बाधा डाल रहा है, एक स्केलर फ़ंक्शन के साथ कुंजी की उपस्थिति की जांच कर रहा है:
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' -- IF !
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_AP_Kontakte WITH CHECK ADD CONSTRAINT [Check_RM_ApertureIDisValid_T_ZO_REM_AP_Raum_Reinigung]
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?