2008-11-25 48 views

Trả lời

24

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; 
+7

Trước tiên, bạn phải sử dụng 'TẠO SCHEMA NewSchema'. – thomaspaulb

+1

@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

+4

@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. –

30

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) 
+0

+1. Cảm ơn Cade, bạn đã cứu tôi một loạt công việc! –

+0

Đ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: ( –

+0

@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 –

2

Đố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) 
+0

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

14

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 
+3

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. –

+0

@AlanMcBee Cảm ơn bạn đã chỉ ra việc hoán đổi lược đồ! Đã cho tôi stumped một lúc :) – FreakinOutMan

+0

Đây phải là câu trả lời được chấp nhận – Kunal

3

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' 
+0

Làm việc cho mi trong SQL Server 2012. Cảm ơn! – Faliorn

0

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 PopulationByCountrySTGCountryRegionSTG

(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.

2

Đâ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 
+1

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! –

Các vấn đề liên quan