Thay đổi tên lược đồ của bảng trong SQL


175

Tôi muốn thay đổi tên lược đồ của bảng Employeestrong Cơ sở dữ liệu. Trong Employeestên lược đồ cơ sở dữ liệu bảng hiện tại là dbotôi muốn thay đổi nó thành exe. Tôi làm nó như thế nào ?

Thí dụ:

TỪ

dbo.Employees

ĐẾN

exe.Employees

Tôi đã thử với truy vấn này:

ALTER SCHEMA exe TRANSFER dbo.Employees

Nhưng điều này cho tôi một lỗi:

Không thể thay đổi lược đồ 'exe', vì nó không tồn tại hoặc bạn không có quyền.

Tôi đã bỏ lỡ cái gì?



1
Liệu lược đồ exe tồn tại?
James Culshaw

Không, tôi đã không tạo ra. Tôi nên làm gì để tạo ra nó?
Cuộc chinh phạt


Tôi đã xem bài viết này nhưng nó hơi khó hiểu. Bạn có thể chỉ cho tôi cách tạo lược đồ trong tình huống của tôi không?
Cuộc chinh phạt

Câu trả lời:


271

Tạo lược đồ:

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

Lược đồ thay thế:

ALTER SCHEMA exe 
    TRANSFER dbo.Employees

3
Bạn có thể giải thích chức năng sys.scemas và EXEC (...) là gì không?
Cuộc chinh phạt

10
sys.schemaslà một bảng chứa tất cả các lược đồ cho cơ sở dữ liệu. Exec ('...') chỉ chạy một cuộc gọi SQL động, trong trường hợp này là cần thiết bởi vì lệnh CREATE SCHema phải là câu lệnh đầu tiên trong một lô truy vấn và thực thi khi SQL động giúp bạn thực hiện điều này.
Eric J. Giá

Đối với tất cả các Bảng , hãy kiểm tra cái nàycái này để làm điều đó trong một câu lệnh, hy vọng sẽ giúp được ai đó.
shaijut

Sử dụng lược đồ thay đổi có vẻ cực kỳ chậm. (Tôi đã dừng nó sau 3 phút để chuyển một bảng nhỏ với 300 hàng.) Thay vào đó, tôi đã sử dụng select * vào exe. Nhân viên từ
dbo.Emp viên

29

Hãy thử dưới đây

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

Tôi đã phải sử dụng set @sql = 'alter schema [' + @newschema + '] transfer [' + @oldschema + '].' + @tableđể đảm bảo một số từ / ký tự đặc biệt không gây ra lỗi.
Stoinov

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

Tôi luôn phải sử dụng dấu ngoặc khi tôi sử dụng ALTER SCHEMAtruy vấn trong SQL hoặc tôi nhận được thông báo lỗi.


5

Thông qua SSMS, tôi đã tạo một lược đồ mới bằng cách:

  • Bấm vào thư mục Bảo mật trong Object Explorer trong máy chủ của tôi,
  • Lược đồ nhấp chuột phải
  • Đã chọn "Lược đồ mới ..."
  • Đặt tên lược đồ mới của tôi (exe trong trường hợp của bạn)
  • Nhấn OK

Tôi tìm thấy bài đăng này để thay đổi lược đồ, nhưng cũng nhận được lỗi quyền tương tự khi cố gắng thay đổi sang lược đồ mới. Tôi có một số cơ sở dữ liệu được liệt kê trong SSMS của mình, vì vậy tôi chỉ thử xác định cơ sở dữ liệu và nó hoạt động:

USE (yourservername)  
ALTER SCHEMA exe TRANSFER dbo.Employees 

3

Mã của bạn là:

FROM
 dbo.Employees
TO
 exe.Employees

Tôi đã thử với truy vấn này.

ALTER SCHEMA exe TRANSFER dbo.Employees

Chỉ cần viết create schema exevà thực hiện nó




0

Hãy rất cẩn thận đổi tên các đối tượng trong sql. Bạn có thể khiến phụ thuộc thất bại nếu bạn không hoàn toàn tránh xa những gì bạn đang làm. Phải nói rằng điều này hoạt động dễ dàng (quá nhiều) để đổi tên những thứ miễn là bạn có quyền truy cập phù hợp vào môi trường:

exec sp_rename 'Nameofobject', 'ReNameofobject'

1
Thật không may, điều này sẽ không hoạt động trong kịch bản này, sp_rename chỉ hoạt động để thay đổi giá trị [name] của một đối tượng. Bạn không thể thay đổi lược đồ với nó. Nếu bạn đã thử, exec sp_rename 'dbo.Employees', 'exe.Employees'bạn sẽ nhận được tên [dbo]. [Ex.Emp viên]
Eric J. Giá

ALTER SCHema (Tên của lược đồ) CHUYỂN GIAO (giản đồ tên). (ObjectName);
djangojazz 18/03/13

Cũng lưu ý rằng khi bạn thay đổi lược đồ của bảng, mọi Chế độ xem sử dụng bảng đó sẽ không được cập nhật. Bạn sẽ cần cập nhật thủ công văn bản (tên lược đồ) trong các chế độ xem này. (Thở dài ...)
Mike Gledhill

0

Hãy chắc chắn rằng bạn đang ở trong bối cảnh cơ sở dữ liệu phù hợp trong SSMS. Có cùng một lỗi với bạn, nhưng tôi biết lược đồ đã tồn tại. Không nhận ra tôi đang ở trong bối cảnh 'MASTER'. THAY ĐỔI làm việc sau khi tôi thay đổi bối cảnh vào cơ sở dữ liệu của tôi.


0

Trong trường hợp, ai đó đang tìm kiếm phiên bản thấp hơn -

Đối với SQL Server 2000:

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

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.