Как переименовать схему с помощью SQL Server?Переименовать схему SQL Server
ответ
Вы перемещать отдельные объекты из одной схемы в другую с помощью:
ALTER SCHEMA NewSchema TRANSFER OldSchema.Object;
Если у вас есть большое количество объектов в схеме, вы можете использовать что-то вроде этого, чтобы произвести все изменения автоматически (это не только таблицы и представления, поэтому, прежде чем запустить его, вам, возможно, потребуется расширить его СФС, 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)
+1. Спасибо Кейду, ты спас мне кучу работы! – 2009-10-27 03:25:01
Это не очень хорошо, если в представлениях содержатся ссылки на oldschema в них, к сожалению :( – 2010-10-15 14:58:00
для процедур
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)
Я объединил оба вышеуказанных кода и использовал курсоры, чтобы не ограничиваться размером строковых переменных, выполняя команды по отдельности. Я предполагаю, что вы уже создали новую схему и потеряете старую после подтверждения всех в порядке. Это безопаснее ... :)
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
Хранимая процедура переименования схемы, которая имеет несколько таблиц в сервере 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'
Простое решение, которое сработало для меня:
У меня есть только одна схема dbo с двумя таблицами PopulationByCountrySTG
и CountryRegionSTG
(1) Я создал новую схему, выполнив,
create schema stg
(2) я выполнил следующие команды,
ALTER SCHEMA stg TRANSFER dbo.PopulationByCountrySTG;
ALTER SCHEMA stg TRANSFER dbo.CountryRegionSTG;
Все сделано. Дайте мне знать, если это сработает для вас. Спасибо, ребята.
Это короткая версия, но хорошо работает.
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
Сначала вы должны использовать `CREATE SCHEMA NewSchema`. – thomaspaulb 2010-11-02 13:26:48
@littlegreen: Вы можете предположить, что схема уже создана, так как пользователь спросил, как переименовать, а не создавать. – Phil 2012-04-29 22:36:20
@Phil - не совсем. Если кто-то еще создал «OldSchema» и интуитивно понятное мышление, это * переименуйте * вместо него, а не создайте новый и передайте ему объекты, то не уверен, что пользователь знает, как создать новую схему в первую очередь. – 2014-10-13 13:05:34