7

के लिए एक अस्थायी तालिका फेंकने की अनुमति त्रुटि पर डीबीसीसी अध्यक्ष, मैं एक गैर-उपयोगकर्ता, 'बीएचके' के रूप में एक SQL सर्वर 2005 डेटाबेस में लॉग इन हूं, जो केवल 'सार्वजनिक' सर्वर भूमिका का सदस्य है। निम्न कोड उपयोगकर्ता 'bhk' नामक संग्रहीत प्रक्रिया के भीतर निष्पादित करने का प्रयास करता है। कोड की यह पंक्ति ...गलत उपयोगकर्ता

TRUNCATE TABLE #Table1 
DBCC CHECKIDENT('#Table1', RESEED, @SequenceNumber) WITH NO_INFOMSGS 

इस त्रुटि का कारण बनता है ...

उपयोगकर्ता 'अतिथि' वस्तु
'# Table1__00000000007F' के लिए बी सी सी CHECKIDENT चलाने की अनुमति जरूरत नहीं है।

मैं बी सी सी CHECKIDENT चलाने के लिए आवश्यक अनुमतियों के बारे में पता कर रहा हूँ ...
कोलर तालिका स्वामित्व होना या sysadmin निश्चित सर्वर रोल के एक सदस्य, db_owner तय डेटाबेस भूमिका, हो सकता है या db_ddladmin निश्चित डेटाबेस भूमिका तय की।

तो मैं दो प्रश्न हैं:

  1. के बाद से 'bhk' एक संग्रहीत प्रक्रिया है कि एक अस्थायी तालिका बनाता है बुला रहा है, नहीं 'bhk' मालिक होना चाहिए और बी सी सी चलाने की अनुमति दी अध्यक्ष?
  2. त्रुटि संदेश वापस लौटाता है कि उपयोगकर्ता 'अतिथि' अनुमति नहीं है? मेरे ज्ञान के लिए, मैं 'अतिथि' के रूप में लॉग इन नहीं हूं।

किसी भी मदद की सराहना की जाएगी।

उत्तर

6

यहाँ एक वैकल्पिक समाधान है, कि यदि आप एक से अधिक 1.

TRUNCATE #Table1 

SET IDENTITY_INSERT #Table1 ON 

INSERT INTO #Table1 (TableID) -- This is your primary key field 
VALUES (@SequenceNumber - 1) 

SET IDENTITY_INSERT #Table1 OFF 

DELETE FROM #Table1 

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

3

आप ने लिखा है:

"कोलर तालिका का स्वामित्व होना या sysadmin निश्चित सर्वर भूमिका, db_owner तय की सदस्य होना।"

तो (यदि यह कोई बग नहीं है) Lieutenant Columbo's त्रुटिहीन तर्क के अनुसार, प्रत्येक प्रीमियर को झूठा होना चाहिए। इसका मतलब है, कॉलर के पास टेबल नहीं है, भले ही उसने इसे बनाया हो।

वास्तव में, ऐसा लगता है कि tempd में बनाई गई सभी ऑब्जेक्ट्स डिफ़ॉल्ट रूप से डीबी के स्वामित्व में हैं। तुम्हें पता है, यह जांच करता है, तो आप क्वेरी विश्लेषक में निम्न कर सकते हैं: अपने डेटाबेस को

  1. कनेक्ट कम अनुमति उपयोगकर्ता का उपयोग कर।
  2. निष्पादित करें: CREATE TABLE #NotMyTable (TestID int identity)
  3. कनेक्ट एक ही एसक्यूएल सर्वर की tempdb को dbo
  4. के रूप में निष्पादित करें: SELECT user_name(uid) FROM sysobjects WHERE name LIKE '#NotMyTable%'

आपको लगता है कि dbo देखेंगे अस्थायी तालिका के मालिक है।

तो, समाधान क्या हो सकता है?

(प्राक्कथन: मैं हेरफेर उस तरह की तरह नहीं, लेकिन बौद्धिक उत्तेजना मुझे गाड़ी चला रहा है ... ;-))

तो, आप एक और संग्रहीत प्रक्रिया है जिससे यूआईडी अद्यतन करता है लिख सकता है tempdb के sysobjects में आपके उपयोगकर्ता के मूल्य (कंपकंपी!) में। मैंने केवल क्वेरी विश्लेषक में इसका परीक्षण किया। अपडेट के बाद मैं आपके डीबीसीसी चेचकेंट कमांड को निष्पादित कर सकता था।

+0

हालांकि यह संभवतः काम करेगा, मैं उस तरह के हेरफेर को पसंद नहीं करने के साथ सहमत हूं। –

1

ट्रंकेट और जांच आदेश करने का एक वैकल्पिक समाधान केवल आपकी अस्थायी तालिका को छोड़ना और फिर से बनाना होगा। जैसे

DROP TABLE #Table1 

CREATE TABLE #Table1 
(
    .... 
) 

हालांकि यह सबसे कुशल समाधान नहीं हो सकता है।

+0

आप सही हैं। हालांकि, मेरी स्थिति में, लक्ष्य पहचान कॉलम को 1 से अलग किसी अन्य चीज़ पर रीसेट करना है। ड्रॉप/बनाएं केवल कॉलम को 1 पर रीसेट करेगा और वैरिएबल को आईडीईटीटीई सीईडी पैरामीटर के मान के रूप में अनुमति नहीं देता है। –

2

आप tempdb तालिका को पूरी तरह अर्हता प्राप्त करके इसे पूरा कर सकते हैं।

DBCC CHECKIDENT([tempdb..#Table1], RESEED, @SequenceNumber) WITH NO_INFOMSGS 
1

मैं बस इसमें भाग गया। मैं जिस उत्तर में आया था वह प्रासंगिक खाते को tempdb डेटाबेस में अनुमति देने के लिए था, जहां, इन तालिकाओं को बनाए रखा गया था।

+0

मैंने इस समस्या को sa के रूप में लॉग इन करके और लॉगिन की जांच करके मैं यह सुनिश्चित करने के लिए उपयोग कर रहा था कि यह एक उपयोगकर्ता को tempdb में मैप किया गया था जिसमें ddladmin में सदस्यता थी – jocassid

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