SQL में तालिका का स्कीमा नाम बदलें


175

मैं Employeesडेटाबेस में तालिका का स्कीमा नाम बदलना चाहता हूं । वर्तमान तालिका Employeesडेटाबेस स्कीमा नाम में dboमैं इसे बदलना चाहता हूं exe। मैं यह कैसे कर सकता हूं ?

उदाहरण:

से

dbo.Employees

सेवा

exe.Employees

मैंने इस प्रश्न के साथ कोशिश की:

ALTER SCHEMA exe TRANSFER dbo.Employees

लेकिन यह मुझे एक त्रुटि देता है:

स्कीमा 'exe' को बदल नहीं सकता, क्योंकि यह मौजूद नहीं है या आपके पास अनुमति नहीं है।

मुझसे क्या छूट गया?


4
क्या आपने exe स्कीमा बनाया है ?

1
स्कीमा exe मौजूद है?
जेम्स कुलशॉ

नहीं, मैंने नहीं बनाया। इसे बनाने के लिए मुझे क्या करना चाहिए?
TheChampion


मैंने इस लेख को देखा लेकिन यह थोड़ा भ्रमित करने वाला है। क्या आप मुझे दिखा सकते हैं कि मेरी स्थिति में स्कीमा कैसे बनाया जाए?
theChampion

जवाबों:


272

स्कीमा बनाएँ:

IF (NOT EXISTS (SELECT * FROM sys.schemas WHERE name = 'exe')) 
BEGIN
    EXEC ('CREATE SCHEMA [exe] AUTHORIZATION [dbo]')
END

योजनाएं:

ALTER SCHEMA exe 
    TRANSFER dbo.Employees

3
क्या आप बता सकते हैं कि sys.scemas और EXEC (...) फ़ंक्शन क्या है?
theChampion

10
sys.schemasएक तालिका है जिसमें डेटाबेस के लिए सभी स्कीमा शामिल हैं। Exec ('...') सिर्फ एक गतिशील SQL कॉल चलाता है, इस मामले में इसकी आवश्यकता है क्योंकि एक CREATE SCHEMA कमांड को क्वेरी बैच में पहला स्टेटमेंट होना चाहिए और डायनेमिक SQL के रूप में निष्पादित करने पर यह आपको मिल जाता है।
एरिक जे। मूल्य

के लिए सभी टेबल्स , जाँच इस और इस एकल बयान में यह करने के लिए, आशा कुछ एक मदद करता है।
शाइजुत

परिवर्तन स्कीमा का उपयोग करना बेहद धीमा लगता है। (300 पंक्तियों के साथ एक छोटी सी तालिका को स्थानांतरित करने के लिए मैंने इसे 3 मिनट के बाद रोक दिया।) इसके बजाय, मैंने * exe.E में कर्मचारियों का उपयोग किया। dbo.Employees
पाँचवीं

29

नीचे कोशिश करें

declare @sql varchar(8000), @table varchar(1000), @oldschema varchar(1000), @newschema   varchar(1000)

  set @oldschema = 'dbo'
  set @newschema = 'exe'

 while exists(select * from sys.tables where schema_name(schema_id) = @oldschema)

  begin
      select @table = name from sys.tables 
      where object_id in(select min(object_id) from sys.tables where  schema_name(schema_id)  = @oldschema)

    set @sql = 'alter schema ' + @newschema + ' transfer ' + @oldschema + '.' + @table

   exec(@sql)
 end

मुझे set @sql = 'alter schema [' + @newschema + '] transfer [' + @oldschema + '].' + @tableयह सुनिश्चित करने के लिए उपयोग करना था कि कुछ विशेष शब्द / वर्ण त्रुटि का कारण नहीं हैं।
स्टोइनोव

21
ALTER SCHEMA NewSchema TRANSFER [OldSchema].[TableName]

मुझे हमेशा ALTER SCHEMASQL में क्वेरी का उपयोग करते समय कोष्ठक का उपयोग करना पड़ता है , या मुझे एक त्रुटि संदेश मिलता है।


5

SSMS के माध्यम से, मैंने एक नया स्कीमा बनाया:

  • मेरे सर्वर के भीतर ऑब्जेक्ट एक्सप्लोरर में सुरक्षा फ़ोल्डर पर क्लिक करना,
  • राइट क्लिक स्कीमा
  • चयनित "नई स्कीमा ..."
  • मेरा नया स्कीमा नाम दिया (आपके मामले में)
  • ठीक है मारो

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

USE (yourservername)  
ALTER SCHEMA exe TRANSFER dbo.Employees 

3

आपका कोड है:

FROM
 dbo.Employees
TO
 exe.Employees

मैंने इस क्वेरी के साथ प्रयास किया।

ALTER SCHEMA exe TRANSFER dbo.Employees

बस लिखो create schema exeऔर उस पर अमल करो



2

क्या आप मुझे उदाहरण दिखा सकते हैं कि मेरी स्थिति में स्कीमा कैसे बनाया जाए?
theChampion

0

Sql में वस्तुओं का नाम बदलने में बहुत सावधानी बरतें। यदि आप पूरी तरह से दूर नहीं हैं तो आप असफलता का कारण बन सकते हैं। यह कहते हुए कि यह आसानी से काम करता है (बहुत अधिक) चीजों का नाम बदलने के लिए, बशर्ते आपके पास पर्यावरण पर उचित पहुंच हो:

exec sp_rename 'Nameofobject', 'ReNameofobject'

1
दुर्भाग्य से यह इस परिदृश्य में काम नहीं करेगा, sp_rename केवल एक वस्तु के [नाम] मान को बदलने के लिए काम करता है। आप इसके साथ स्कीमा नहीं बदल सकते। अगर आपने कोशिश की exec sp_rename 'dbo.Employees', 'exe.Employees'तो आपको [dbo] नाम मिल जाएगा। [exe.Employees]
एरिक जे। प्राइस

ALTER SCHEMA (स्कीमा का नाम) स्थानांतरण (स्कीमा नाम)। (ObjectName);
djangojazz

यह भी ध्यान दें कि जब आप किसी तालिका का स्कीमा बदलते हैं, तो उस तालिका का उपयोग करने वाला कोई भी दृश्य अपडेट नहीं होगा । आपको इन दृश्यों में टेक्स्ट (स्कीमा नाम) को मैन्युअल रूप से अपडेट करना होगा। (आह ...)
माइक गिल्डहिल

0

सुनिश्चित करें कि आप SSMS में सही डेटाबेस संदर्भ में हैं। आप के रूप में एक ही त्रुटि है, लेकिन मुझे पता था कि स्कीमा पहले से ही मौजूद थी। एहसास नहीं था कि मैं 'मास्टर' संदर्भ में था। जब मैंने अपने डेटाबेस का संदर्भ बदला तो मैंने काम किया।


0

मामले में, किसी को कम संस्करण की तलाश है -

SQL Server 2000 के लिए:

sp_changeobjectowner @objname = 'dbo.Employess', @newowner = 'exe'

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