मैं db स्कीमा को dbo में कैसे बदलूं


115

मैंने एक पुराने एसक्यूएल सर्वर (2000) से अपने 2008 के डेटाबेस में तालिकाओं का एक गुच्छा आयात किया। सभी आयातित तालिकाओं को मेरे उपयोगकर्ता नाम के साथ उपसर्ग किया गया है, उदाहरण के लिए jonathan.MovieData:। तालिका में propertiesयह jonathanडीबी स्कीमा के रूप में सूचीबद्ध करता है। जब मैं संग्रहीत प्रक्रियाओं को लिखता हूं तो मुझे अब jonathan.सभी तालिका नामों के सामने शामिल करना होगा जो भ्रामक है।

मैं अपने सभी तालिकाओं को जोनाथन के बजाय डीबीओ में कैसे बदलूं?

वर्तमान परिणाम: jonathan.MovieData

वांछित परिणाम: dbo.MovieData

जवाबों:


179
ALTER SCHEMA dbo TRANSFER jonathan.MovieData;

ALTER SCHEMA देखें ।

सामान्यीकृत सिंटैक्स:

ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName; 

12
गोगलर्स के लिए समय बचाने के लिए: ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName;
Co7e

1
यदि उपयोगकर्ता के पास बैकस्लैश है, तो निम्नलिखित को चलाएँ: ALTER SCHEMA dbo TRANSFER "DOMAIN \ user" .tableName
PatricF

@PatricF उद्धृत पहचानकर्ता नियम स्कीमा नामों पर किसी अन्य नाम के समान ही लागू होते हैं [DOMAIN\user].[tableName]:। SQL सर्वर समुदाय में सामान्य रूप से Transact-SQL उद्धृत पहचानकर्ता ( [और ]) का उपयोग किया जाता है , "जब तक कि इसके लिए कोई विशिष्ट आवश्यकता न हो।
रेमस रूसु

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

2
जब आप किसी SQL ऑब्जेक्ट नाम के बारे में सटीक होना चाहते हैं तो @leigero का उपयोग करें [और ]किसी भी अन्य मामले की तरह। [domain\user123].TableName
रेमस रूसन

40

आप निम्नलिखित चला सकते हैं, जो आपके सभी तालिकाओं के लिए ALTER sCHEMA कथनों का एक सेट उत्पन्न करेगा:

SELECT 'ALTER SCHEMA dbo TRANSFER ' + TABLE_SCHEMA + '.' + TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'jonathan'

फिर आपको क्वेरी एनालाइज़र में कथनों को कॉपी और रन करना होगा।

यहाँ एक पुरानी स्क्रिप्ट है जो आपके लिए भी यही करेगी, मुझे लगता है कि ऑब्जेक्ट के मालिक को बदलकर। हालांकि, 2008 पर इसे आजमाया नहीं गया।

DECLARE @old sysname, @new sysname, @sql varchar(1000)

SELECT
  @old = 'jonathan'
  , @new = 'dbo'
  , @sql = '
  IF EXISTS (SELECT NULL FROM INFORMATION_SCHEMA.TABLES
  WHERE
      QUOTENAME(TABLE_SCHEMA)+''.''+QUOTENAME(TABLE_NAME) = ''?''
      AND TABLE_SCHEMA = ''' + @old + '''
  )
  EXECUTE sp_changeobjectowner ''?'', ''' + @new + ''''

EXECUTE sp_MSforeachtable @sql

इस साइट से मिला ।

यह भी अगर आप की जरूरत के लिए संग्रहीत सहारा के लिए ऐसा करने के बारे में बात करता है।


मैंने कोई फायदा नहीं होने के लिए दूसरा प्रयास किया, लेकिन लिंक के लिए धन्यवाद, मैं इस पर गौर करूंगा।
जोनाथन हॉल

क्या आप अपने सभी ALTER SCHEMA कथनों को स्वचालित रूप से जनरेट करने के लिए उपरोक्त INFORMATION_SCHEMA का उपयोग करने में सक्षम नहीं थे?
पटमार्टटेक

INFORMATION_SCHEMA.TABLES के प्रलेखन से निम्नलिखित उद्धरण नोट करें : " महत्वपूर्ण वस्तु का स्कीमा निर्धारित करने के लिए INFORMATION_SCHEMA विचारों का उपयोग न करें। किसी ऑब्जेक्ट का स्कीमा खोजने का एकमात्र विश्वसनीय तरीका sys.objects कैटलॉग दृश्य को क्वेरी करना है।" इस प्रकार, उदाहरण के sys.tablesबजाय (sys.objects का सबसेट) का उपयोग करने के लिए फिर से लिखा जाना चाहिए ।
हिनजी


15

डॉबो स्कीमा से MySchema में तालिका ले जाएँ:

 ALTER SCHEMA MySchema TRANSFER dbo.MyTable


MySchema से dbo स्कीमा में तालिका ले जाएँ:

 ALTER SCHEMA dbo TRANSFER MySchema.MyTable

9

मैंने इसे इसी तरह के प्रश्न पर पोस्ट किया है: एसक्यूएल सर्वर 2005 में, मैं किसी भी डेटा को खोए बिना तालिका के "स्कीमा" को कैसे बदल सकता हूं?


एक मामूली सईद उत्तम जवाब देने के लिए सुधार ...

मैंने इस कोड को स्व-निष्पादित करने के लिए एक निष्पादन जोड़ा, और मैंने शीर्ष पर एक संघ जोड़ा ताकि मैं दोनों तालिकाओं और संग्रहीत प्रक्रियाओं के स्कीमा को बदल सकूं:

DECLARE cursore CURSOR FOR 


select specific_schema as 'schema', specific_name AS 'name'
FROM INFORMATION_SCHEMA.routines
WHERE specific_schema <> 'dbo' 

UNION ALL

SELECT TABLE_SCHEMA AS 'schema', TABLE_NAME AS 'name'
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_SCHEMA <> 'dbo' 



DECLARE @schema sysname, 
 @tab sysname, 
 @sql varchar(500) 


OPEN cursore     
FETCH NEXT FROM cursore INTO @schema, @tab 

WHILE @@FETCH_STATUS = 0     
BEGIN 
 SET @sql = 'ALTER SCHEMA dbo TRANSFER [' + @schema + '].[' + @tab +']'    
 PRINT @sql   
 exec (@sql)  
 FETCH NEXT FROM cursore INTO @schema, @tab     
END 

CLOSE cursore     
DEALLOCATE cursore

मुझे भी एक dbdump को पुनर्स्थापित करना पड़ा, और पाया कि स्कीमा dbo नहीं थी - मैंने गंतव्य स्कीमा को बदलने के लिए Sql Server प्रबंधन स्टूडियो या विज़ुअल स्टूडियो डेटा ट्रांसफ़र प्राप्त करने की कोशिश में घंटों का समय बिताया ... मैंने बस इसे बहाल करने के खिलाफ चल रहा है। चीजों को जिस तरह से मैं चाहता था पाने के लिए नए सर्वर पर डंप।


एक इलाज करता है। धन्यवाद।
bgx


2

किसी व्यक्तिगत चीज़ के लिए इसे करने का तरीका:

स्कीमा dbo स्थानांतरण jonathan.ovieData को बदलें


2

मेरे पास एक समान मुद्दा था लेकिन मेरे स्कीमा में एक बैकस्लैश था। इस स्थिति में, स्कीमा के चारों ओर कोष्ठक शामिल करें।

ALTER SCHEMA dbo TRANSFER [DOMAIN\jonathan].MovieData;

2

एसक्यूएल खाते के रूप में एसक्यूएल सर्वर खोलें और नीचे दिए गए प्रश्नों पर नए क्वेरी पर क्लिक करें

फिर निष्पादित पर क्लिक करें, यह सभी स्वामित्व स्कीमा को वापस SA खाते में रोलबैक करेगा

alter authorization on schema::[db_datareader] to [dbo]
alter authorization on schema::[db_datareader] to [db_datareader]
alter authorization on schema::[db_datawriter] to [dbo]
alter authorization on schema::[db_datawriter] to [db_datawriter]
alter authorization on schema::[db_securityadmin] to [dbo]
alter authorization on schema::[db_securityadmin] to [db_securityadmin]
alter authorization on schema::[db_accessadmin] to [dbo]
alter authorization on schema::[db_accessadmin] to [db_accessadmin]
alter authorization on schema::[db_backupoperator] to [dbo]
alter authorization on schema::[db_backupoperator] to [db_backupoperator]
alter authorization on schema::[db_ddladmin] to [dbo]
alter authorization on schema::[db_ddladmin] to [db_ddladmin]
alter authorization on schema::[db_owner] to [dbo]
alter authorization on schema::[db_owner] to [db_owner]

1

एमएस-सहायता: //MS.SQLCC.v9/MS.SQLSVR.v9.en/tsqlref9/html/0a760138-460e-410a-a3c1-d60af03bf2ed.htm

ALTER SCHEMA स्कीमा_name स्थानांतरण securable_name

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