2008-11-25 6 views

ответ

24

Вы перемещать отдельные объекты из одной схемы в другую с помощью:

ALTER SCHEMA NewSchema TRANSFER OldSchema.Object; 
+7

Сначала вы должны использовать `CREATE SCHEMA NewSchema`. – thomaspaulb 2010-11-02 13:26:48

+1

@littlegreen: Вы можете предположить, что схема уже создана, так как пользователь спросил, как переименовать, а не создавать. – Phil 2012-04-29 22:36:20

+4

@Phil - не совсем. Если кто-то еще создал «OldSchema» и интуитивно понятное мышление, это * переименуйте * вместо него, а не создайте новый и передайте ему объекты, то не уверен, что пользователь знает, как создать новую схему в первую очередь. – 2014-10-13 13:05:34

30

Если у вас есть большое количество объектов в схеме, вы можете использовать что-то вроде этого, чтобы произвести все изменения автоматически (это не только таблицы и представления, поэтому, прежде чем запустить его, вам, возможно, потребуется расширить его СФС, UDFs и т.д.)

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. Спасибо Кейду, ты спас мне кучу работы! – 2009-10-27 03:25:01

+0

Это не очень хорошо, если в представлениях содержатся ссылки на oldschema в них, к сожалению :( – 2010-10-15 14:58:00

2

для процедур

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) 
14

Я объединил оба вышеуказанных кода и использовал курсоры, чтобы не ограничиваться размером строковых переменных, выполняя команды по отдельности. Я предполагаю, что вы уже создали новую схему и потеряете старую после подтверждения всех в порядке. Это безопаснее ... :)

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

Хранимая процедура переименования схемы, которая имеет несколько таблиц в сервере SQL 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 

Выполните процедуру переименования схемы: примеры:

EXECUTE RenameSchema 'oldname','newname' 
    EXECUTE RenameSchema 'dbo','guest' 
0

Простое решение, которое сработало для меня:
У меня есть только одна схема dbo с двумя таблицами PopulationByCountrySTG и CountryRegionSTG

(1) Я создал новую схему, выполнив,

create schema stg 

(2) я выполнил следующие команды,

ALTER SCHEMA stg TRANSFER dbo.PopulationByCountrySTG; 
ALTER SCHEMA stg TRANSFER dbo.CountryRegionSTG; 

Все сделано. Дайте мне знать, если это сработает для вас. Спасибо, ребята.

2

Это короткая версия, но хорошо работает.

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 

 Смежные вопросы

  • Нет связанных вопросов^_^