8

हम ऑडिट डेटाबेस (SQL सर्वर 2008) में प्रविष्टियों को लिखने के लिए LINQ से इकाइयों का उपयोग करते हैं। चूंकि यह एक समर्पित लेखापरीक्षा डेटाबेस है, इसलिए हम केवल पंक्तियां डालें - हम कभी भी किसी भी पंक्ति को पढ़ते हैं, उन्हें ऑडिटिंग एप्लिकेशन से अपडेट या हटाते हैं।एंटिफ़ाई फ्रेमवर्क इन्सर्ट की आवश्यकता है अनुमतियों का चयन करें

ऑडिटिंग एप्लिकेशन को कम विशेषाधिकार के सिद्धांत का उपयोग करना चाहिए, इसलिए हम इसकी आवश्यकता से अधिक अनुमतियां नहीं देना चाहते हैं। चूंकि हमने कभी भी कोई पंक्ति नहीं पढ़ी है, इसलिए हम डेटाबेस से चयन करने की अनुमति नहीं देना चाहते हैं।

चयन अनुमति ऑब्जेक्ट 'AuditEvent', डेटाबेस 'IdentifyAudit', स्कीमा 'dbo' पर मना कर दिया था:

हालांकि, जब हम डेटा लिखने के लिए प्रयास करते हैं, हम इस त्रुटि संदेश मिलता है।

var auditEvent = new AuditEvent(); 
auditEvent.EventType = eventType; 
auditEvent.Timestamp = timestamp; 
auditEvent.UserName = userName; 
auditEvent.ApplicationId = this.ApplicationId; 

this.objectContext.AddToAuditEvents(auditEvent); 
this.objectContext.SaveChanges(); 

हम चयन की अनुमति की आवश्यकता क्यों मेज पर लिखने के लिए, और अधिक महत्वपूर्ण है::

कोड सुंदर मानक एफई कोड है वहाँ किसी भी तरह से हम चाहते हैं कि आवश्यकता को दूर कर सकते हैं?


संपादित

एसक्यूएल प्रोफाइलर इस बयान से पता चलता निष्पादित किया जा रहा:

exec sp_executesql N'insert [dbo].[AuditEvent]([EventType], [Timestamp], [UserName], [ApplicationId]) 
values (@0, @1, @2, @3) 
select [Id] 
from [dbo].[AuditEvent] 
where @@ROWCOUNT > 0 and [Id] = scope_identity()',N'@0 nvarchar(10),@1 datetimeoffset(7),@2 nvarchar(11),@3 nvarchar(36)',@0=N'UpdateUser',@1='2009-11-10 10:58:33.2814740 +01:00',@2=N'foo',@3=N'bar' 

यह क्यों चयन अनुमतियों की जरूरत है क्योंकि आपरेशन रिटर्न का स्वत: जनरेट आईडी बताते हैं, डाली गई पंक्ति

प्रश्न अब बनी हुई है: मुझे अभी पंक्ति डालने वाली पंक्ति की आईडी जानने की आवश्यकता नहीं है, तो क्या कोई तरीका है कि मैं इस सुविधा को बंद कर सकता हूं?

+0

एसक्यूएल प्रोफाइलर क्या दिखाता है? –

+1

एसक्यूएल प्रोफाइलर डेटा शामिल करने के लिए संपादित प्रश्न। –

उत्तर

8

डिफ़ॉल्ट रूप से, आप ऑब्जेक्ट कॉन्टेक्स्ट में कोई इकाई जोड़ने के बाद और SaveChanges को उस ऑब्जेक्ट की स्थिति को अपरिवर्तित से जोड़कर बदलते हैं और यह अभी भी ऑब्जेक्ट कॉन्टेक्स्ट द्वारा ट्रैक किया जाता है। यही कारण है कि ईएफ को उस आईडी की आवश्यकता है ताकि वह इसमें बदलावों को ट्रैक कर सके।

Entity Keys and added objects:

1. इकाई वस्तु का निर्माण किया है। इस बिंदु पर कुंजी गुण सभी मूलभूत मूल्यों, या तो नल या है 0.

2. नई वस्तु ObjectContext के लिए या तो AddObject या संस्था से एक सेट विशिष्ट में जोड़ने के तरीकों को फोन करके जोड़ा जाता है संदर्भ या कॉल करके नेविगेशन प्रॉपर्टी जोड़ें जो EntityCollection देता है।

इस बिंदु पर, वस्तु सेवाएं एक अस्थायी कुंजी, है जो ObjectStateManager में वस्तुओं स्टोर करने के लिए इस्तेमाल किया उत्पन्न करता है।

3. सेव चेंज को ऑब्जेक्ट कॉन्टेक्स्ट पर बुलाया जाता है।

एक INSERT कथन इकाई सेवाओं द्वारा उत्पन्न होता है और डेटा स्रोत पर निष्पादित किया जाता है।

4. अगर INSERT ऑपरेशन सफल होता है, सर्वर द्वारा जेनरेट किए गए मान ऑब्जेक्टस्टेट एंटर्री पर वापस लिखे गए हैं।

5. ऑब्जेक्टस्टेट एंटर्री ऑब्जेक्ट को सर्वर से उत्पन्न मान के साथ अद्यतन करता है।

6.When AcceptChanges ObjectStateEntry पर कहा जाता है, एक स्थायी EntityKey नई सर्वर द्वारा जेनरेट मानों का उपयोग कर की जाती है।

तो, जहां तक ​​मुझे पता है, इस सुविधा को ऑब्जेक्ट कॉन्टेक्स्ट से स्विच करना संभव नहीं है और मुझे इस समस्या का कोई भी "अच्छा" समाधान नहीं दिख रहा है: एक तरीका जिससे आप इससे बच सकते हैं इसका उपयोग करना है इकाई को सम्मिलित करने के लिए स्वयं संग्रहित प्रक्रियाएं (यदि आप कर सकते हैं) (http://msdn.microsoft.com/en-us/library/bb399203.aspx)।

इसके अलावा, यदि कोई सर्वर जेनरेट आईडी नहीं है, तो मुझे लगता है कि चयन क्वेरी निष्पादित नहीं की जाएगी (फिर, यदि आप डीबीएस बदल सकते हैं, और यदि आप आईडी की पीढ़ी के साथ परेशान करना चाहते हैं)।

3

हालांकि, यह एक पुराना सवाल है लेकिन भविष्य के लिए शायद कोई भी इसका उपयोग करेगा। एक तरीका है केवल आईडी फ़ील्ड को चुनिंदा अनुमति देना।

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