ฉันจะเปลี่ยน db schema เป็น dbo ได้อย่างไร


115

ฉันนำเข้าตารางจำนวนมากจากเซิร์ฟเวอร์ sql เก่า (2000) ไปยังฐานข้อมูลปี 2008 ของฉัน jonathan.MovieDataทุกตารางที่นำเข้าจะมีคำนำหน้าด้วยชื่อผู้ใช้ของฉันตัวอย่างเช่น: ในตารางpropertiesจะแสดงรายการjonathanเป็น db schema เมื่อฉันเขียนกระบวนงานที่จัดเก็บไว้ตอนนี้ฉันต้องรวมjonathan.ไว้หน้าชื่อตารางทั้งหมดซึ่งทำให้สับสน

ฉันจะเปลี่ยนตารางทั้งหมดให้เป็น dbo แทนโจนาธานได้อย่างไร

ผลลัพธ์ปัจจุบัน: jonathan.MovieData

ผลลัพธ์ที่ต้องการ: dbo.MovieData

คำตอบ:


179
ALTER SCHEMA dbo TRANSFER jonathan.MovieData;

ดูALTER SCHEMA

ไวยากรณ์ทั่วไป:

ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName; 

12
เพื่อประหยัดเวลาสำหรับ Googler: แก้ไข SCHEMA TargetSchema TRANSFER SourceSchema.TableName;
Co7e

1
หากผู้ใช้มีแบ็กสแลชให้รันสิ่งต่อไปนี้: แก้ไข SCHEMA dbo TRANSFER "DOMAIN \ user" .tableName
PatricF

@PatricF ตัวระบุอ้างกฎนำไปใช้กับชื่อสกีมาเช่นเดียวกับชื่ออื่น ๆ[DOMAIN\user].[tableName]: โดยทั่วไปในชุมชน SQL Server จะใช้ตัวระบุที่ยกมาของ Transact-SQL ( [และ]) หลีกเลี่ยง"เว้นแต่จะมีข้อกำหนดเฉพาะสำหรับมัน
Remus Rusanu

ขณะที่เขาขอตารางทั้งหมดของฉันตรวจสอบสิ่งนี้และสิ่งนี้เพื่อทำในคำสั่งเดียวหวังว่าจะช่วยได้บ้าง
shaijut

2
@leigero ใช้[และ]เช่นเดียวกับกรณีอื่น ๆ เมื่อคุณต้องการความแม่นยำเกี่ยวกับชื่อวัตถุ SQL [domain\user123].TableName.
Remus Rusanu

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

ได้มาจากเว็บไซต์นี้

นอกจากนี้ยังพูดถึงการทำเช่นเดียวกันสำหรับ procs ที่เก็บไว้หากคุณต้องการ


ฉันลองบิตที่สอง แต่ไม่มีประโยชน์ แต่ขอบคุณสำหรับลิงค์ฉันจะตรวจสอบมัน
jonathan hall

คุณไม่สามารถใช้ INFORMATION_SCHEMA ที่เลือกด้านบนเพื่อสร้างคำสั่ง ALTER SCHEMA ของคุณโดยอัตโนมัติได้หรือไม่?
patmortech

หมายเหตุคำพูดต่อไปนี้จากเอกสารของ INFORMATION_SCHEMA.TABLES : " สิ่งสำคัญอย่าใช้มุมมอง INFORMATION_SCHEMA เพื่อกำหนดสคีมาของวัตถุวิธีเดียวที่เชื่อถือได้ในการค้นหาสคีมาของวัตถุคือการสอบถามมุมมองแค็ตตาล็อก sys.objects" ดังนั้นตัวอย่างควรถูกเขียนใหม่เพื่อใช้sys.tables(ชุดย่อยของ sys.objects) แทน
Heinzi


15

ย้ายตารางจาก dbo schema ไปที่ MySchema:

 ALTER SCHEMA MySchema TRANSFER dbo.MyTable


ย้ายตารางจาก MySchema ไปยัง dbo schema:

 ALTER SCHEMA dbo TRANSFER MySchema.MyTable

9

ฉันเพิ่งโพสต์คำถามนี้ในคำถามที่คล้ายกัน: ใน sql server 2005 ฉันจะเปลี่ยน "สคีมา" ของตารางโดยไม่ให้ข้อมูลสูญหายได้อย่างไร


การปรับปรุงเล็กน้อยสำหรับคำตอบที่ยอดเยี่ยมของ sAeid ...

ฉันเพิ่ม exec เพื่อให้โค้ดนี้ดำเนินการด้วยตนเองและฉันได้เพิ่มสหภาพที่ด้านบนเพื่อที่ฉันจะสามารถเปลี่ยนสคีมาของทั้งสองตารางและขั้นตอนที่จัดเก็บ:

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 หรือการถ่ายโอนข้อมูลสตูดิโอภาพเพื่อแก้ไขสคีมาปลายทาง ... ฉันลงเอยด้วยการเรียกใช้สิ่งนี้กับการกู้คืน ถ่ายโอนข้อมูลบนเซิร์ฟเวอร์ใหม่เพื่อรับสิ่งต่างๆในแบบที่ฉันต้องการ


ใช้งานได้จริง ขอบคุณ
bgx



2

ฉันมีปัญหาที่คล้ายกัน แต่สคีมาของฉันมีเครื่องหมายแบ็กสแลชอยู่ ในกรณีนี้ให้ใส่วงเล็บรอบสคีมา

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

2

เปิด SQL Server เป็นบัญชี SA และคลิกที่แบบสอบถามใหม่ผ่านแบบสอบถามด้านล่าง

จากนั้นคลิกที่ดำเนินการมันจะย้อนกลับสคีมาที่เป็นเจ้าของทั้งหมดกลับไปที่บัญชี 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-ความช่วยเหลือ: //MS.SQLCC.v9/MS.SQLSVR.v9.en/tsqlref9/html/0a760138-460e-410a-a3c1-d60af03bf2ed.htm

แก้ไข SCHEMA schema_name TRANSFER securable_name

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.