तालिका का स्कीमा निर्दिष्ट किए बिना क्वेरी


10

मैंने SQL Server 2000 से टेबल का एक गुच्छा अपने 2008 डेटाबेस में आयात किया। सभी आयातित तालिकाओं को मेरे उपयोक्तानाम के साथ उपसर्ग किया जाता है जैसे erpadmin.tablename:।

तालिका के गुणों में यह db स्कीमा के रूप में 'erpadmin' को सूचीबद्ध करता है। जब मैं एक प्रश्न लिखता हूं तो मुझे अब 'erpadmin' को शामिल करना होगा। सभी तालिका नामों के सामने जो भ्रामक है।

वर्तमान परिणाम:

select *
from erpadmin.tablename

वांछित परिणाम:

select *
from  tablename

जवाबों:


23

यदि आप dbo स्कीमा का उपयोग करके वापस जाना चाहते हैं जैसे आप SQL Server 2000 में थे, तो आप तालिका को dbo स्कीमा में वापस ले जा सकते हैं:

ALTER SCHEMA dbo TRANSFER erpadmin.tablename;

एक विकल्प यदि आप गैर-डोबो स्कीमा रखना पसंद करते हैं, तो अपने उपयोगकर्ता के डिफ़ॉल्ट स्कीमा को erpadminतब सेट करना है जब आप स्कीमा निर्दिष्ट नहीं करते हैं, तो यह उस डिफ़ॉल्ट के रूप में उपयोग करेगा। (Sysadmin निश्चित सर्वर भूमिका के सदस्य डिफ़ॉल्ट रूप से अनदेखा DEFAULT_SCHEMAऔर उपयोग करते हैं dbo।)

ALTER USER erpadmin WITH DEFAULT_SCHEMA = erpadmin;

हालाँकि आपके पास (स्कीमा.टेबल) दो भाग का नाम एक अच्छी आदत है, इसलिए आप यह स्पष्ट कर सकते हैं कि आप किस तालिका का उल्लेख कर रहे हैं। कुछ सुविधाओं के लिए आपको दो-भाग के नाम का उपयोग करना होगा, अनुक्रमित दृश्य एक उदाहरण हैं।


17

यह एक क्लासिक मामला है कि डेटाबेस ऑब्जेक्ट्स को एक्सेस करते समय आपको स्कीमा नाम क्यों निर्दिष्ट करना चाहिए । जब यह अनिर्दिष्ट है और आप किसी गैर-डिफ़ॉल्ट स्कीमा में किसी ऑब्जेक्ट तक पहुंचने का प्रयास कर रहे हैं, तो आप उस मुद्दे पर चलने वाले हैं जिसे आप अभी देख रहे हैं।

वास्तविक निर्धारण आपके एप्लिकेशन (या आपके पास अभी जो भी क्वेरी एजेंट है वह समस्या का कारण बनता है) को स्पष्ट करने के लिए है।

जब मैं एक प्रश्न लिखता हूं तो मुझे अब 'erpadmin' को शामिल करना होगा। सभी तालिका नामों के सामने जो भ्रामक है।

यह भ्रामक नहीं है, यह एक स्पष्ट नामकरण सम्मेलन है । मेरा सुझाव है कि आप वस्तु की फेरबदल और विसंगतियों से बचने के लिए उस नामकरण के साथ रहें।


3
हमेशा दो-भाग नामों का उपयोग करने का एक अन्य कारण उस स्थिति से बचना है जहां कई उपयोगकर्ता एक ही कोड को निष्पादित करते हैं (उदाहरण के लिए select ... from table5 ;) और विभिन्न परिणाम प्राप्त करते हैं। यह योजना कैशिंग के लिए खराब है और समस्या निवारण के लिए भी बुरा है (क्यू समर्थन व्यक्ति, "यह प्रश्न यहां ठीक चलता है")। इसके अलावा, स्कीमाबाइंडिंग, जो कार्यों और विचारों के अनुक्रमण के लिए आवश्यक है, दो भाग नामों की आवश्यकता होती है। TLDR: आलसी होना बंद करें - दो भाग नामों का उपयोग करें।
ग्रीनस्टोन वाकर

7

@AdamWenger जवाब के अलावा। एनोटेशन स्कीमा में स्थानांतरण के लिए स्क्रिप्ट बनाने के लिए आप निम्नलिखित स्क्रिप्ट का उपयोग कर सकते हैं

select 'ALTER SCHEMA dbo TRANSFER '+s.name+'.'+t.name
from sys.schemas s
     join sys.tables t on t.schema_id=s.schema_id
where s.name='erpadmin'

4

माइग्रेशन कैसे हुआ, इसकी वजह से आपकी परेशानी होने की संभावना है। जब तक आपको स्वामी नहीं माना जाता है, तब तक सामग्री आपके उपयोगकर्ता से जुड़ी नहीं होनी चाहिए।

स्कीमा वहाँ हैं जो आपको अलग-अलग तालिकाओं से मदद करने के लिए समझ में आता है। मान लीजिए कि आपके पास HR प्रस्थान के लिए संसाधनों की एक तालिका है और दोनों समान डेटाबेस पर रखते हुए उत्पादन विभाग के लिए एक अलग चाहते हैं। उस स्थिति में आपके पास संसाधनों के नाम वाली दो तालिकाएँ हो सकती हैं, एक उत्पादन स्कीमा में और दूसरी एचआर स्कीमा में। इसीलिए, जब तक आप डिफ़ॉल्ट स्कीमा में सामान नहीं लाते हैं, तब तक shasmas को निर्दिष्ट किया जाना चाहिए।

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


-2

USE [tablename] अपनी क्वेरी के साथ अपनी कमांड शुरू करें आपके पास संदर्भ के लिए एक संबद्ध डेटाबेस नहीं है और जिस डेटाबेस को आप देख रहे हैं वह उपयोगकर्ता में लॉग इन के लिए डिफ़ॉल्ट नहीं है क्वेरी विंडो के शीर्ष पर यह संभवतः "मास्टर" कहता है


3
तुम्हारा मतलब है [database_name], है ना?
देज़ो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.