2014-11-01 2 views
7

मैं SQL Server 2008 के साथ काम कर रहा हूं और मेरे पास दो मौजूदा टेबल हैं, venues और eventsचेक बाधा के साथ कस्टम फ़ंक्शन SQL Server 2008

मुझे यकीन है कि events तालिका में event_expected_attendance कॉलम में पूर्णांक हमेशा venues तालिका में से कम या venue_max_capacity पूर्णांक के बराबर है बनाने के लिए एक चेक बाधा के साथ एक कस्टम समारोह बनाने के लिए कोशिश कर रहा हूँ।

मैं कस्टम फ़ंक्शन के सिंटैक्स के साथ-साथ जॉइन स्टेटमेंट के साथ संघर्ष कर रहा हूं क्योंकि चेक बाधा दो तालिकाओं के बीच है।

सहायता के लिए धन्यवाद! मैं जल्दी से किसी भी अतिरिक्त प्रश्न का उत्तर दूंगा।

+0

हाँ , दो टेबल event_id = event_venue_id – James

+0

पर जुड़ जाएंगे एक ट्रिगर भी इसे पूरा करेगा, लेकिन यह प्रदर्शन/अद्यतन/प्रदर्शन को प्रभावित करेगा। आप 'घटनाओं 'तालिका पर तालिका पर एक ट्रिगर बनाते हैं जो' स्थानों' तालिका की जांच करता है और एक त्रुटि/रोल वापस अमान्य मान उठाता है –

उत्तर

8

के रूप में एक यूडीएफ के साथ एक चेक बाधा का उपयोग कर मार्टिन स्मिथ ने कहा कुछ समस्या है और प्रदर्शन पर एक नकारात्मक प्रभाव हो सकता है, लेकिन इस कोड काम करना चाहिए अगर तुम वैसे भी यह कोशिश करना चाहता हूँ:

CREATE FUNCTION dbo.CheckVenueCapacity (@venue_id int, @capacity int) 
RETURNS int 
AS 
BEGIN 
    DECLARE @retval int 
    SELECT @retval = CASE WHEN venue_max_capacity >= @capacity THEN 0 ELSE 1 END 
    FROM venues 
    WHERE venue_id = @venue_id 
    RETURN @retval 
END; 
GO 

ALTER TABLE events 
    ADD CONSTRAINT chkVenueCapacity 
    CHECK (dbo.CheckVenueCapacity(event_venue_id, event_expected_attendance) = 0); 
7

आप इस के लिए एक अदिश यूडीएफ इस्तेमाल कर सकते हैं लेकिन जांच की कमी में उन का उपयोग कर अच्छी तरह से समस्याओं दस्तावेज़ तैयार किया है (उदाहरण के लिए देख Scalar UDFs wrapped in CHECK constraints are very slow and may fail for multirow updates या Snapshot isolation: A threat for integrity? श्रृंखला।

यह भी डेटाबेस इंजन एक अनुक्रमित दृष्टि से इस लागू करने के लिए प्राप्त करने के लिए संभव है

इसे 2 पंक्तियों के साथ एक सहायक तालिका की आवश्यकता है क्योंकि सीटीई और UNION अनुक्रमित विचारों में अनुमत नहीं हैं। विचार यह है कि दृश्य परिभाषा हमेशा शून्य पंक्तियों को वापस करनी चाहिए और यह उल्लंघन होने पर लौटाई गई किसी भी पंक्ति को दोगुना कर देता है। इसलिए दृश्य पर अद्वितीय बाधा का उल्लंघन और त्रुटि उत्पन्न होने और बयान विफल होने का कारण बनता है।

CREATE TABLE dbo.TwoNums 
    (
    Num INT PRIMARY KEY 
) 

INSERT INTO dbo.TwoNums 
VALUES  (1), 
      (2) 

तब दृश्य परिभाषा

CREATE VIEW dbo.PreventOverCapacity 
WITH SCHEMABINDING 
AS 
    SELECT V.Venueid, 
     E.EventId, 
     E.Expected, 
     V.Capacity 
    FROM dbo.Venues V 
     JOIN dbo.Events E 
      ON E.venueid = V.venueid 
       AND E.Expected > V.Capacity 
     CROSS JOIN dbo.TwoNums 

और देखें पर एक अद्वितीय सूचकांक

CREATE UNIQUE CLUSTERED INDEX [UIX_PreventOverCapacity (Venueid, EventId, Expected, Capacity)] 
    ON dbo.PreventOverCapacity(Venueid, EventId, Expected, Capacity) 

सभी चार स्तंभों सहित के लिए कारण है, ताकि सभी आवश्यक मान में दिखाए जाते हैं त्रुटि संदेश।

वस्तु 'dbo.PreventOverCapacity' अद्वितीय सूचकांक 'UIX_PreventOverCapacity (Venueid, eventID, उम्मीद, क्षमता)' के साथ में डुप्लिकेट कुंजी पंक्ति सम्मिलित नहीं कर सकते।
डुप्लिकेट कुंजी मान (1, 9 7, 110, 100) है।

संबंधित मुद्दे