2009-07-18 15 views
105

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

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

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

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

उत्तर

161
ALTER SCHEMA dbo TRANSFER jonathan.MovieData; 

ALTER SCHEMA देखें।

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

ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName; 
+10

समय बचाने के लिए Googlers के लिए: ALTER SCHEMA TargetSchema ट्रांसफर SourceSchema.TableName; – Co7e

+0

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

+0

@PatricF [उद्धृत पहचानकर्ता] (https://msdn.microsoft.com/en-us/library/ms174393.aspx) नियम किसी भी अन्य नाम के रूप में स्कीमा नामों पर लागू होते हैं: '[DOMAIN \ उपयोगकर्ता]। [tableName] '। सामान्य रूप से एसक्यूएल सर्वर समुदाय में ट्रांजैक्ट-एसक्यूएल उद्धृत पहचानकर्ताओं का उपयोग किया जाता है ('[' और ']'), '' '' से बचें जब तक इसके लिए कोई विशिष्ट आवश्यकता न हो। –

1

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

ALTER SCHEMA schema_name स्थानांतरण securable_name

38

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

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 

इसे this site से मिला।

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

बदलने स्कीमा dbo हस्तांतरण jonathan.MovieData

+0

मैंने दूसरी बिट का कोई फायदा नहीं लिया, लेकिन लिंक के लिए धन्यवाद, मैं इसे देख लूंगा। –

+0

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

+0

[INFORMATION_SCHEMA.TABLES] के दस्तावेज़ों से निम्नलिखित उद्धरण नोट करें (https://docs.microsoft.com/en-us/sql/relational-databases/system-Information-schema-views/टेबल-ट्रांजैक्ट-एसक्यूएल): * "** महत्वपूर्ण ** INFORMATION_SCHEMA विचारों का उपयोग न करें t o किसी ऑब्जेक्ट की स्कीमा निर्धारित करें। किसी ऑब्जेक्ट की स्कीमा को खोजने का एकमात्र विश्वसनीय तरीका sys.objects कैटलॉग व्यू से पूछताछ करना है। "* इस प्रकार, उदाहरण को sys.tables' (sys.objects का सबसेट) का उपयोग करने के लिए फिर से लिखा जाना चाहिए। – Heinzi

2

एक व्यक्ति बात के लिए यह करने के लिए रास्ता एसएड के उत्कृष्ट उत्तर के लिए ...

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

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 नहीं था - मैं गंतव्य स्कीमा को बदलने के लिए एसक्यूएल सर्वर प्रबंधन स्टूडियो या विजुअल स्टूडियो डेटा स्थानान्तरण प्राप्त करने की कोशिश कर रहे घंटे बिताए ...मैं इसे नए तरीके से पुनर्स्थापित डंप के खिलाफ चला रहा था ताकि मैं वांछित तरीके से चीजें प्राप्त कर सकूं। dbo स्कीमा से MySchema को

11

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

ALTER SCHEMA MySchema TRANSFER dbo.MyTable 


ले जाएँ तालिका:

ALTER SCHEMA dbo TRANSFER MySchema.MyTable 
2

मेरे पास एक समान समस्या थी लेकिन मेरी स्कीमा में बैकस्लैश था। इस मामले में, स्कीमा के चारों ओर ब्रैकेट शामिल करें। SA खाते के रूप में

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

ओपन एसक्यूएल सर्वर और नई क्वेरी पर क्लिक अतीत झटका प्रश्नों

अमल पर क्लिक करने के अलावा

, यह एसए खाते में सभी स्वामित्व स्कीमा वापस रोलबैक होगा

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] 
संबंधित मुद्दे