2008-10-01 15 views
7

के लिए बहुत सारे झंडे को कैसे संभालना है मुझे अपने SQL2k8 तालिका में अपेक्षाकृत बड़े झंडे को कैसे संभालना है, इस बारे में सलाह चाहिए।एसक्यूएल रिकॉर्ड

दो सवाल है, मेरे साथ सहन :)

चलो कहते हैं कि मैं 20 झंडे मैं एक रिकार्ड के लिए स्टोर करने के लिए करना चाहते हैं तो कृपया।

उदाहरण के लिए:

CanRead = 0x1 CanWrite = 0x2 CanModify = 0x4 ... और इतने अंतिम ध्वज को पर 2^20

अब, अगर मैं के निम्नलिखित संयोजन सेट एक रिकॉर्ड: अनुमतियाँ = CanRead | CanWrite

मैं आसानी से देख सकते हैं कि रिकॉर्ड करने से अनुमति की आवश्यकता नहीं है कि क्या कहां (अनुमतियां & CanRead) = CanRead

काम करता है।

लेकिन, मैं उन सभी रिकॉर्ड्स को भी पुनर्प्राप्त करना चाहूंगा जो या तो लिख सकते हैं या संशोधित कर सकते हैं।

यदि मैं कहां जारी करता हूं (अनुमति & (CanWrite | CanModify)) = (CanWrite | CanModify) मुझे स्पष्ट रूप से मेरा रिकॉर्ड नहीं मिलेगा जिसमें कैनरेड पर अनुमतियां हैं। CanWrite

दूसरे शब्दों में, मैं अपने मास्क में किसी भी झंडे से मेल खाने वाले रिकॉर्ड कैसे प्राप्त कर सकता हूं जो मैं प्रक्रिया में भेज रहा हूं?

दूसरा प्रश्न, SQL 2008 में कितना सक्षम है? क्या वास्तव में 20 बिट फ़ील्ड बनाने के लिए बेहतर होगा?

आपकी मदद

उत्तर

6

WHERE (Permissions & CanWrite) = CanWrite 
OR (Permissions & CanModify) = CanModify 

के बारे में क्या करने के लिए धन्यवाद?

3

कहां (अनुमतियां & CanWrite) = CanWrite या (अनुमतियां & CanModify) = CanModify

मुझे लगता है कि

1

यह एक अलग अनुमतियाँ मॉडल के लिए काफी बेहतर होगा।

20 झंडे मुझे इंगित करेंगे कि एक पुनर्विचार की आवश्यकता है, अधिकांश फाइलिंग सिस्टम 12 मूल झंडे और एसीएलएस के साथ प्राप्त कर सकते हैं - हो सकता है कि एक अलग तालिका हो जो केवल अनुमति देता है, या ऑब्जेक्ट्स या एक्सेसर्स को अलग-अलग नियंत्रण की अनुमति देता है।

मैं उम्मीद करता हूं कि 20 अलग-अलग फ़ील्ड होने के लिए चयन करें - लेकिन मैं प्रदर्शन के लिए 20 फ़ील्ड भी नहीं जोड़ूंगा।

--update--

मूल प्रश्न

WHERE (Permissions & (CanWrite | CanModify)) > 0 

पर्याप्त होगा के रूप में लिखा, लेकिन यह क्या आप डेटाबेस में है के रूप में यद्यपि विशेषताओं का एक सेट है होना करने के लिए लगता है कि एक इकाई कर सकते हैं की है।इस मामले में केवल एक समझदार (डेटाबेस शर्तों में) ऐसा करने का तरीका एक विशेषता तालिका में एक से कई रिश्तों के साथ है।

0

नहीं, यह काम नहीं करेगा।

मैं सिर्फ एक मुखौटा भेज रहा प्रक्रिया को

कुछ @filter जो सी # में मैं के साथ @filter = CanModify भरने की तरह | CanWrite

तो, प्रक्रिया को फ़िल्टर के रूप में OR-ed मान प्राप्त होता है।

ओह और वैसे, यह एक अनुमति मॉडल नहीं है, मैं इसे एक उदाहरण के रूप में उपयोग कर रहा हूं।

मेरे पास वास्तव में लगभग 20 अद्वितीय झंडे हैं जो मेरी वस्तु के पास हो सकती हैं।

3

... के रूप में सरल है ना

WHERE (Permissions & (CanWrite | CanModify)) > 0 

... किसी भी 'सा' 1 पर सेट किया जा रहा के रूप में एक गैर शून्य '&' ऑपरेटर के लिए मूल्य का परिणाम देगा।

दिन में देर हो चुकी है, और मैं घर जा रहा हूं, इसलिए मेरा दिमाग अक्षमता से काम कर रहा है।

11

ऐसा न करें। यह एक ज्ञापन क्षेत्र में एक CSV स्ट्रिंग को सहेजने और डेटाबेस के उद्देश्य को हराने की तरह है।

प्रत्येक ध्वज के लिए एक बूलियन (बिट) मान का उपयोग करें। इस विशिष्ट नमूने में आपको वह सब कुछ मिल रहा है जो पढ़ और लिख सकता है या संशोधित कर सकता है:

WHERE CanRead AND (CanWrite OR CanModify) 

कोई चालाक हैक के साथ सरल शुद्ध एसक्यूएल। अतिरिक्त 7 बिट आप हर झंडे के लिए बर्बाद कर रहे हैं सिरदर्द के लायक नहीं हैं।

+0

-1 क्योंकि तार्किक और/या बिटवाई और/| के समान नहीं हैं। –

+2

वे हैं, जैसा कि पोस्टर ने सुझाव दिया है, प्रत्येक फ़ील्ड में केवल एक बिट है। –

+0

इसे एक साधारण उदाहरण के उदाहरण के रूप में लें, जो कि बिट मानों से निपटने के दौरान आपको आवश्यक है। मेरा इरादा एक विशिष्ट क्वेरी को पुन: पेश नहीं करना था। – VVS

12

मुझे लगता है कि आपकी अनुमति कॉलम एक इंट है। यदि ऐसा है, तो मैं आपको नीचे दिए गए नमूना कोड के साथ खेलने के लिए प्रोत्साहित करता हूं। यह आपको कार्यक्षमता कैसे काम करता है इसका एक स्पष्ट संकेत देना चाहिए।

Declare @Temp Table(Permission Int, PermissionType VarChar(20)) 

Declare @CanRead Int 
Declare @CanWrite Int 
Declare @CanModify Int 

Select @CanRead = 1, @CanWrite = 2, @CanModify = 4 

Insert Into @Temp Values(@CanRead | @CanWrite, 'Read,write') 
Insert Into @Temp Values(@CanRead, 'Read') 
Insert Into @Temp Values(@CanWrite, 'Write') 
Insert Into @Temp Values(@CanModify | @CanWrite, 'Modify, write') 
Insert Into @Temp Values(@CanModify, 'Modify') 

Select * 
From @Temp 
Where Permission & (@CanRead | @CanWrite) > 0 

Select * 
From @Temp 
Where Permission & (@CanRead | @CanModify) > 0 

जब आप तार्किक उपयोग करते हैं और आपको अपनी स्थिति के आधार पर उचित रूप से 1 सेट के साथ एक संख्या मिल जाएगी। यदि कुछ भी मेल नहीं खाता है, तो परिणाम 0 होगा। यदि 1 या अधिक स्थिति मेल खाता है, तो परिणाम 0 से अधिक होगा

मुझे आपको एक उदाहरण दिखाएं।

मान लीजिए CanRead = 1, CanWrite = 2, और CanModify = 4. मान्य संयोजनों हैं:

Modify Write Read Permissions 
------ ----- ---- ----------- 
    0  0 0 Nothing 
    0  0 1 Read 
    0  1 0 Write 
    0  1 1 Read, Write 
    1  0 0 Modify 
    1  0 1 Modify, Read 
    1  1 0 Modify, Write 
    1  1 1 Modify, Write, Read 

अब, आप या पढ़ें के लिए परीक्षण संशोधित रखना चाहते हैं। अपने ऐप से, आप पास कर सकते हैं (CanRead | CanModify)। यह 101 होगा (बाइनरी में)।

सबसे पहले, आइए केवल तालिका में एक पंक्ति के खिलाफ इसका परीक्षण करें।

001 (Row from table) 
& 101 (Permissions to test) 
------ 
    001 (result is greater than 0) 

अब, एक पंक्ति के खिलाफ परीक्षण करें जो केवल लिख चुका है।

010 (Row from table) 
& 101 (Permission to test) 
------ 
    000 (result = 0) 

अब पंक्ति के विरुद्ध परीक्षण करें जिसमें सभी 3 अनुमतियां हैं।

111 (Row from table) 
& 101 (Permission to test) 
------ 
    101 (result is greater than 0) 

मुझे आशा है कि आप देख सकते हैं कि अगर एक मूल्य = 0 में और आपरेशन के परिणाम का नतीजा है, तो परीक्षण किया अनुमतियों से कोई भी उस पंक्ति पर लागू होते हैं। यदि मान 0 से बड़ा है, तो कम से कम एक पंक्ति मौजूद है।

0

यह केवल तभी करें जब आप किसी अन्य कुंजी से पूछताछ कर रहे हों।

अगर आप ध्वज संयोजनों से पूछताछ कर रहे हैं तो ऐसा न करें। इस कॉलम के खिलाफ एक सूचकांक सामान्य रूप से आपकी मदद नहीं करेगा। आप टेबल-स्कैन तक ही सीमित रहेंगे।

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