Làm cách nào để đổi tên lược đồ bằng SQL Server?Đổi tên lược đồ SQL Server
Trả lời
Bạn di chuyển đối tượng cá nhân từ một schema khác thông qua:
ALTER SCHEMA NewSchema TRANSFER OldSchema.Object;
Nếu bạn có một số lượng lớn các đối tượng trong một lược đồ, bạn có thể sử dụng một cái gì đó như thế này để tạo ra tất cả những thay đổi tự động (nó chỉ thực hiện bảng và quan điểm, vì vậy trước khi bạn chạy nó, bạn có thể cần phải mở rộng nó để SPs, UDFs vv)
USE SandBox
DECLARE @OldSchema AS varchar(255)
DECLARE @NewSchema AS varchar(255)
SET @OldSchema = 'dbo'
SET @NewSchema = 'StackOverflow'
DECLARE @sql AS varchar(MAX)
SET @sql = 'CREATE SCHEMA [' + @NewSchema + ']' + CHAR(13) + CHAR(10)
SELECT @sql = @sql + 'ALTER SCHEMA [' + @NewSchema + '] TRANSFER [' + TABLE_SCHEMA + '].[' + TABLE_NAME + ']'
+ CHAR(13) + CHAR(10)
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = @OldSchema
SET @sql = @sql + 'DROP SCHEMA [' + @OldSchema + ']'
PRINT @sql -- NOTE PRINT HAS AN 8000 byte limit - 8000 varchar/4000 nvarchar - see comments
IF (0=1) EXEC (@sql)
+1. Cảm ơn Cade, bạn đã cứu tôi một loạt công việc! –
Điều này không hoạt động tốt nếu các khung nhìn chứa tham chiếu đến oldschema trong chúng, không may: ( –
@mgroves Có, nhưng các đối tượng trong lược đồ không yêu cầu các đối tượng khác trong cùng một lược đồ được đặt trước, vì vậy đó có thể là một thiết kế Bạn có thể cố gắng nắm bắt điều đó bằng cách sử dụng khung nhìn hoặc mã proc (được lưu trữ trong siêu dữ liệu) để tìm kiếm các lỗi tiềm ẩn của các tiền tố. Bạn có thể nắm bắt các vấn đề phân tích cú pháp tiềm ẩn sau khi di chuyển hàng loạt bằng cách cố gắng làm mới tất cả (không xác định) các mô-đun SQL –
Đối Thủ tục
USE DatabaseName
DECLARE @OldSchema AS varchar(255)
DECLARE @NewSchema AS varchar(255)
SET @OldSchema = 'ComputerLearn'
SET @NewSchema = 'Basic'
DECLARE @sql AS varchar(MAX)
SET @sql = 'CREATE SCHEMA [' + @NewSchema + ']' + CHAR(13) + CHAR(10)
SELECT @sql = @sql + 'ALTER SCHEMA [' + @NewSchema + '] TRANSFER [' + sys.schemas.name + '].[' + sys.procedures.name + ']'
+ CHAR(13) + CHAR(10)
FROM sys.procedures,sys.schemas
WHERE sys.procedures.schema_id=sys.schemas.schema_id and sys.schemas.name = @OldSchema
SET @sql = @sql + 'DROP SCHEMA [' + @OldSchema + ']'
PRINT @sql
IF (0=1) EXEC (@sql)
NẾU (0 = 1) EXEC (@ sql) nó sẽ luôn luôn là sai, vì vậy tôi nghĩ rằng cần phải loại bỏ phần IF từ dòng cuối cùng, nếu không nó hoạt động như quyến rũ !!! một phiếu bầu từ tôi. – sib10
Tôi đã kết hợp cả hai mã trên và sử dụng con trỏ để không bị giới hạn bởi kích thước của các biến chuỗi, thực hiện các lệnh riêng lẻ. Tôi giả sử bạn đã tạo lược đồ mới và sẽ bỏ lược đồ cũ sau khi xác nhận tất cả là ok. Đó là an toàn hơn ... :)
DECLARE @OldSchema AS varchar(255)
DECLARE @NewSchema AS varchar(255)
SET @OldSchema = 'dbo'
SET @NewSchema = 'StackOverflow'
DECLARE @sql AS varchar(MAX)
DECLARE @Schema AS varchar(MAX)
DECLARE @Obj AS varchar(MAX)
-- First transfer Tables and Views
DECLARE CU_OBJS CURSOR FOR
SELECT TABLE_SCHEMA, TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = @OldSchema
OPEN CU_OBJS
FETCH NEXT FROM CU_OBJS
INTO @Schema, @Obj
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @sql = 'ALTER SCHEMA [' + @NewSchema + '] TRANSFER [' + @OldSchema + '].[' + @Obj + ']'
PRINT @sql
-- EXEC (@sql)
FETCH NEXT FROM CU_OBJS
INTO @Schema, @Obj
END
CLOSE CU_OBJS
DEALLOCATE CU_OBJS
-- Now transfer Stored Procedures
DECLARE CU_OBJS CURSOR FOR
SELECT sys.schemas.name, sys.procedures.name
FROM sys.procedures,sys.schemas
WHERE sys.procedures.schema_id=sys.schemas.schema_id and sys.schemas.name = @OldSchema
OPEN CU_OBJS
FETCH NEXT FROM CU_OBJS
INTO @Schema, @Obj
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @sql = 'ALTER SCHEMA [' + @NewSchema + '] TRANSFER [' + @Schema + '].[' + @Obj + ']'
PRINT @sql
-- EXEC (@sql)
FETCH NEXT FROM CU_OBJS
INTO @Schema, @Obj
END
CLOSE CU_OBJS
DEALLOCATE CU_OBJS
Tôi nghĩ rằng bạn có thứ tự các đối số được đảo ngược trên dòng 'ALTER' đầu tiên. '@ NewSchema' sẽ được liệt kê đầu tiên, sau' ALTER SCHEMA', nhưng bạn đang hiển thị '@ OldSchema' trước. Nếu không, nó hoạt động khá tốt. Nó không đổi tên lược đồ sâu (tham chiếu bên trong sp hoặc các khung nhìn), nhưng cũng không có giải pháp nào trong số các giải pháp này làm được. –
@AlanMcBee Cảm ơn bạn đã chỉ ra việc hoán đổi lược đồ! Đã cho tôi stumped một lúc :) – FreakinOutMan
Đây phải là câu trả lời được chấp nhận – Kunal
Các thủ tục lưu trữ để đổi tên schema trong đó có bảng hơn trong SQL server 2008
IF OBJECT_ID ('dbo.RenameSchema', 'P') IS NOT NULL
DROP PROCEDURE dbo.RenameSchema;
GO
CREATE PROCEDURE dbo.RenameSchema
@OLDNAME varchar(500),
@NEWNAME varchar(500)
AS
/*check for oldschema exist or not */
IF NOT EXISTS (SELECT 1 FROM sys.schemas WHERE name = @OLDNAME)
BEGIN
RETURN
END
/* Create the schema with new name */
IF NOT EXISTS (SELECT 1 FROM sys.schemas WHERE name = @NEWNAME)
BEGIN
EXECUTE('CREATE SCHEMA ' + @NEWNAME);
END
/* get the object under the old schema and transfer those objects to new schema */
DECLARE Schema_Cursor CURSOR FOR
SELECT ' ALTER SCHEMA ' + @NEWNAME + ' TRANSFER '+ SCHEMA_NAME(SCHEMA_ID)+'.'+ name
as ALTSQL from sys.objects WHERE type IN ('U','V','P','Fn') AND
SCHEMA_NAME(SCHEMA_ID) = @OLDNAME;
OPEN Schema_Cursor;
DECLARE @SQL varchar(500)
FETCH NEXT FROM Schema_Cursor INTO @SQL;
WHILE @@FETCH_STATUS = 0
BEGIN
exec (@SQL)
FETCH NEXT FROM Schema_Cursor INTO @SQL;
END;
CLOSE Schema_Cursor;
DEALLOCATE Schema_Cursor;
/* drop the old schema which should be the user schema */
IF @OLDNAME <> 'dbo' and @OLDNAME <> 'guest'
BEGIN
EXECUTE ('DROP SCHEMA ' + @OLDNAME)
END
GO
Thực hiện các thủ tục để đổi tên schema: ví dụ:
EXECUTE RenameSchema 'oldname','newname'
EXECUTE RenameSchema 'dbo','guest'
Làm việc cho mi trong SQL Server 2012. Cảm ơn! – Faliorn
Giải pháp dễ nhất làm việc cho tôi là:
Tôi chỉ có một lược đồ dbo với hai bảng PopulationByCountrySTG
và CountryRegionSTG
(1) Tôi tạo ra một sơ đồ mới bằng cách thực hiện,
create schema stg
(2) Tôi thực hiện các lệnh sau,
ALTER SCHEMA stg TRANSFER dbo.PopulationByCountrySTG;
ALTER SCHEMA stg TRANSFER dbo.CountryRegionSTG;
Tất cả được thực hiện. Hãy cho tôi biết nếu nó hoạt động cho bạn .. Cảm ơn Guys.
Đây là phiên bản ngắn nhưng hoạt động tốt.
declare @sql varchar(8000), @table varchar(1000), @oldschema varchar(1000), @newschema varchar(1000)
set @oldschema = 'old'
set @newschema = 'dbo'
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
Cảm ơn vì điều này! Trong trường hợp của tôi, tôi đã chuyển sang một lược đồ mới, và phải nhớ đến 'CREATE SCHEMA [newSchema]' trước tiên! –
- 1. Sử dụng tên lược đồ với SQL Server & ServiceStack.OrmLite
- 2. SQL Server Compact - Quản lý lược đồ
- 3. Lược đồ nhân rộng SQL Server Merge
- 4. Vai trò, lược đồ SQL Server, người dùng
- 5. Các phương pháp hay nhất về lược đồ SQL Server
- 6. Các bảng SQL Server được đặt tên Với lược đồ dbo
- 7. Sửa đổi Bộ sưu tập giản đồ SQL Server
- 8. Thực hành tốt nhất cho thay đổi lược đồ SQL Server 2008
- 9. Đổi tên cột trong SQL Server
- 10. Tạo biểu đồ quan hệ bảng từ lược đồ hiện có (SQL Server)
- 11. Làm cách nào để thay đổi tên lược đồ?
- 12. Làm cách nào để đổi tên lược đồ MySQL?
- 13. Giản đồ máy chủ SQL và lược đồ mặc định
- 14. Khung Entity xử lý các lược đồ SQL Server như thế nào?
- 15. Cách cho phép người dùng SQL Server chèn/cập nhật/xóa dữ liệu, nhưng không thay đổi lược đồ?
- 16. Thực tiễn tốt nhất để sử dụng lược đồ trong SQL Server (2008)
- 17. Hiệu năng của các hệ thống lược đồ EAV/mở lớn trên SQL Server
- 18. thông tin lược đồ information_schema không đáng tin cậy trên SQL Server?
- 19. SQL Server 2008 xóa tất cả các bảng theo lược đồ đặc biệt
- 20. Thay đổi tên cột trong SQL Server 2008
- 21. Đổi tên cột khi sử dụng PIVOT SQL Server 2008
- 22. Chuyển đổi tên tháng thành số tháng trong SQL Server
- 23. Đổi tên một cột trong MS SQL Server 2005
- 24. Đổi tên một ràng buộc trong SQL Server?
- 25. Chiến lược triển khai cơ sở dữ liệu (SQL Server)
- 26. Cách lấy tên lược đồ từ đối tượng lược đồ trong Tridion?
- 27. Thay đổi "lược đồ" trong RavenDB
- 28. Thay đổi lược đồ của System.Uri
- 29. Chuyển đổi XSD sang lược đồ RDF
- 30. Rails Postgresql nhiều lược đồ và cùng một tên bảng
Trước tiên, bạn phải sử dụng 'TẠO SCHEMA NewSchema'. – thomaspaulb
@littlegreen: Bạn có thể giả sử lược đồ đã được tạo từ khi người dùng hỏi cách đổi tên, chứ không phải tạo. – Phil
@Phil - không thực sự. Nếu ai đó tạo ra 'OldSchema' và suy nghĩ trực quan là * đổi tên * nó thay vì tạo một cái mới và chuyển các đối tượng vào nó, thì không chắc chắn rằng người dùng biết để tạo lược đồ mới trước. –