เปลี่ยนชื่อ Schema ของตารางใน SQL


175

ฉันต้องการเปลี่ยนชื่อสคีมาของตารางEmployeesในฐานข้อมูล ในตารางปัจจุบันEmployeesฐานข้อมูลชื่อสกีคือผมต้องการที่จะเปลี่ยนไปdbo exeฉันจะทำมันได้อย่างไร

ตัวอย่าง:

จาก

dbo.Employees

ถึง

exe.Employees

ฉันลองกับคำถามนี้:

ALTER SCHEMA exe TRANSFER dbo.Employees

แต่นี่ทำให้ฉันมีข้อผิดพลาด:

ไม่สามารถแก้ไข schema 'exe' ได้เนื่องจากไม่มีอยู่หรือคุณไม่ได้รับอนุญาต

ฉันพลาดอะไร?


4
คุณสร้าง exe schemaหรือไม่
PinnyM

1
schema exe มีอยู่จริงหรือไม่?
James Culshaw

ไม่ฉันไม่ได้สร้าง ฉันควรทำอย่างไรเพื่อสร้างมันขึ้นมา?
theChampion


ฉันเห็นบทความนี้ แต่มันสับสนเล็กน้อย คุณสามารถแสดงวิธีสร้างสคีมาในสถานการณ์ของฉันได้ไหม
theChampion

คำตอบ:


272

สร้างสคีมา:

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

Schema เปลี่ยนแปลง:

ALTER SCHEMA exe 
    TRANSFER dbo.Employees

3
คุณสามารถอธิบายฟังก์ชั่น sys.scemas และ EXEC (... ) ได้อย่างไร?
theChampion

10
sys.schemasเป็นตารางที่มีสกีมาทั้งหมดสำหรับฐานข้อมูล Exec ('... ') เพียงเรียกใช้การเรียก SQL แบบไดนามิกในกรณีนี้จำเป็นเนื่องจากคำสั่ง CREATE SCHEMA จะต้องเป็นคำสั่งแรกในแบตช์แบบสอบถามและดำเนินการตาม SQL แบบไดนามิกที่จะทำให้คุณได้รับสิ่งนี้
Eric J. Price

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

ใช้ schema เปลี่ยนแปลงดูเหมือนช้ามาก (ฉันหยุดหลังจาก 3 นาทีเพื่อถ่ายโอนตารางขนาดเล็กที่มี 300 แถว) แต่ฉันเลือก select * เป็น exe.Employees จาก dbo.Employees
fivelements

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เพื่อให้แน่ใจว่าคำ / ตัวอักษรพิเศษบางอย่างไม่ทำให้เกิดข้อผิดพลาด
Stoinov

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

ฉันมักจะต้องใช้วงเล็บเมื่อฉันใช้ALTER SCHEMAแบบสอบถามใน SQL หรือฉันได้รับข้อความแสดงข้อผิดพลาด


5

ผ่าน SSMS ฉันสร้าง schema ใหม่โดย:

  • การคลิกโฟลเดอร์ความปลอดภัยใน Object Explorer ภายในเซิร์ฟเวอร์ของฉัน
  • คลิกขวาที่ Schemas
  • เลือก "โครงสร้างใหม่ ... "
  • ตั้งชื่อสคีมาใหม่ของฉัน (exe ในกรณีของคุณ)
  • กดตกลง

ฉันพบโพสต์นี้เพื่อเปลี่ยนสคีมา แต่ยังได้รับข้อผิดพลาดการอนุญาตเดียวกันเมื่อพยายามเปลี่ยนเป็นสคีมาใหม่ ฉันมีฐานข้อมูลหลายรายการใน 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

ตรวจสอบ MSDN ...

CREATE SCHEMA: http://msdn.microsoft.com/en-us/library/ms189462.aspx

แล้วก็

ALTER SCHEMA: http://msdn.microsoft.com/en-us/library/ms173423.aspx

หรือคุณสามารถตรวจสอบได้ที่ SO ...

ฉันจะย้ายตารางไปยังสกีมาใน T-SQL ได้อย่างไร


คุณสามารถแสดงตัวอย่างวิธีสร้างสคีมาในสถานการณ์ของฉันได้หรือไม่
theChampion

0

ระมัดระวังการเปลี่ยนชื่อวัตถุใน sql คุณสามารถทำให้การพึ่งพาล้มเหลวหากคุณไม่ได้อยู่กับสิ่งที่คุณทำอย่างเต็มที่ ต้องบอกว่าใช้งานได้ง่าย (มากเกินไป) สำหรับการเปลี่ยนชื่อสิ่งต่าง ๆ หากคุณมีการเข้าถึงที่เหมาะสมกับสภาพแวดล้อม:

exec sp_rename 'Nameofobject', 'ReNameofobject'

1
น่าเสียดายที่นี่ไม่สามารถใช้งานได้ในสถานการณ์นี้ sp_rename ใช้งานได้เฉพาะการเปลี่ยนค่า [ชื่อ] ของวัตถุ คุณไม่สามารถเปลี่ยนสคีมาได้ หากคุณลองexec sp_rename 'dbo.Employees', 'exe.Employees'คุณจะได้รับชื่อ [dbo] [exe.Employees]
Eric J. Price

ALTER SCHEMA (ชื่อของ Schema) TRANSFER (schemaName). (ObjectName);
djangojazz

นอกจากนี้โปรดทราบว่าเมื่อคุณเปลี่ยนสคีมาของตาราง Views ใด ๆ ที่ใช้ตารางนั้นจะไม่ได้รับการอัพเดต คุณจะต้องอัปเดตข้อความ (ชื่อสกีมา) ด้วยตนเองในมุมมองเหล่านี้ (ถอนหายใจ ... )
Mike Gledhill

0

ตรวจสอบให้แน่ใจว่าคุณอยู่ในบริบทฐานข้อมูลที่ถูกต้องใน SSMS มีข้อผิดพลาดเดียวกับคุณ แต่ฉันรู้ว่ามีสคีมาอยู่แล้ว ไม่ทราบว่าฉันอยู่ในบริบท 'MASTER' ALTER ทำงานหลังจากที่ฉันเปลี่ยนบริบทเป็นฐานข้อมูลของฉัน


0

ในกรณีที่มีคนมองหารุ่นที่ต่ำกว่า -

สำหรับ SQL Server 2000:

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

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