Làm cách nào để thay đổi lược đồ db thành dbo


115

Tôi đã nhập một loạt các bảng từ một máy chủ sql cũ (2000) vào cơ sở dữ liệu năm 2008 của tôi. Tất cả các bảng đã nhập đều có tiền tố với tên người dùng của tôi, ví dụ : jonathan.MovieData. Trong bảng, propertiesnó liệt kê jonathannhư lược đồ db. Khi tôi viết các thủ tục được lưu trữ, bây giờ tôi phải đưa jonathan.vào trước tất cả các tên bảng gây nhầm lẫn.

Làm cách nào để thay đổi tất cả các bảng của tôi thành dbo thay vì jonathan?

Kết quả hiện tại: jonathan.MovieData

Kết quả như ý: dbo.MovieData

Câu trả lời:


179
ALTER SCHEMA dbo TRANSFER jonathan.MovieData;

Xem ALTER SCHema .

Cú pháp tổng quát:

ALTER SCHEMA TargetSchema TRANSFER SourceSchema.TableName; 

12
Để tiết kiệm thời gian cho nhân viên của Google: ALTER SCHema TargetSchema CHUYỂN GIAO SourceSchema.TableName;
Co7e

1
Nếu người dùng có dấu gạch chéo ngược, hãy chạy như sau: ALTER SCHema dbo CHUYỂN GIAO "DOMAIN \ user" .tableName
PatricF

@PatricF Các quy tắc định danh được trích dẫn áp dụng cho các tên lược đồ giống như bất kỳ tên nào khác : [DOMAIN\user].[tableName]. Nói chung trong cộng đồng SQL Server, các định danh trích dẫn Transact-SQL được sử dụng ( []), tránh "trừ khi có một yêu cầu cụ thể cho nó.
Remus Rusanu

Khi Ngài yêu cầu tất cả các Bảng của tôi , hãy kiểm tra cái nàycái này để làm điều đó trong một tuyên bố duy nhất, hy vọng sẽ giúp được ai đó.
shaijut

2
@leigero sử dụng [], giống như bất kỳ trường hợp nào khác khi bạn muốn chính xác về tên đối tượng SQL. [domain\user123].TableName.
Remus Rusanu

40

Bạn có thể chạy các thao tác sau, sẽ tạo ra một tập hợp các câu lệnh ALTER sCHema cho tất cả các tài năng của bạn:

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

Sau đó, bạn phải sao chép và chạy các câu lệnh trong bộ phân tích truy vấn.

Đây là một kịch bản cũ hơn sẽ làm điều đó cho bạn, tôi nghĩ bằng cách thay đổi chủ sở hữu đối tượng. Mặc dù vậy, họ đã không thử nó vào năm 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

Có nó từ trang web này .

Nó cũng nói về việc làm tương tự cho các procs được lưu trữ nếu bạn cần.


Tôi đã thử bit thứ hai nhưng không có kết quả, nhưng nhờ liên kết, tôi sẽ xem xét nó.
hội trường jonathan

Có phải bạn không thể sử dụng lựa chọn Information_SCHema ở trên để tự động tạo tất cả các câu lệnh ALTER SCHema của mình không?
patmortech

Lưu ý trích dẫn sau đây từ tài liệu của Information_SCHema.TABLES : " Quan trọng Không sử dụng các khung nhìn Information_SCHema để xác định lược đồ của một đối tượng. Cách duy nhất đáng tin cậy để tìm lược đồ của một đối tượng là truy vấn khung nhìn danh mục sys.objects." Vì vậy, ví dụ nên được viết lại để sử dụng sys.tables(một tập hợp con của sys.objects).
Heinzi


15

Di chuyển bảng từ lược đồ dbo sang MySchema:

 ALTER SCHEMA MySchema TRANSFER dbo.MyTable


Di chuyển bảng từ MySchema sang lược đồ dbo:

 ALTER SCHEMA dbo TRANSFER MySchema.MyTable

9

Tôi vừa đăng bài này cho một câu hỏi tương tự: Trong máy chủ sql 2005, làm cách nào để thay đổi "lược đồ" của bảng mà không mất bất kỳ dữ liệu nào?


Một cải tiến nhỏ cho câu trả lời tuyệt vời của sAeid ...

Tôi đã thêm một hàm thực thi để mã này tự thực thi và tôi đã thêm một liên kết ở trên cùng để tôi có thể thay đổi lược đồ của cả hai bảng VÀ các thủ tục được lưu trữ:

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

Tôi cũng đã phải khôi phục một dbdump và thấy rằng lược đồ không phải là dbo - Tôi đã mất hàng giờ cố gắng để có được phòng quản lý Sql Server hoặc truyền dữ liệu phòng thu trực quan để thay đổi lược đồ đích ... Tôi đã kết thúc việc này để chống lại khôi phục kết xuất trên máy chủ mới để có được mọi thứ theo cách tôi muốn.


Làm việc một điều trị. Cảm ơn.
bgx


2

Cách để làm điều đó cho một điều cá nhân:

thay đổi lược đồ chuyển dbo jonathan.MovieData


2

Tôi đã có một vấn đề tương tự nhưng lược đồ của tôi có một dấu gạch chéo ngược trong đó. Trong trường hợp này, bao gồm các dấu ngoặc quanh lược đồ.

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

2

Mở SQL Server dưới dạng tài khoản SA và nhấp vào truy vấn mới qua các truy vấn bên dưới

sau đó nhấp vào thực thi, nó sẽ khôi phục tất cả các lược đồ sở hữu trở lại tài khoản 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-help: //MS.SQLCC.v9/MS.SQLSVR.v9.en/tsqlref9/html/0a760138-460e-410a-a3c1-d60af03bf2ed.htm

THAY ĐỔI lược đồ SCHema_name CHUYỂN GIAO securable_name

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.