重命名SQL Server架构
我怎样才能使用SQL Server重命名模式?
如果模式中有大量对象,则可以使用类似的方式自动生成所有的更改(它只会执行表和视图,所以在运行之前,可能需要将其展开为SP,UDF等)。 。)
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)
通过以下方式将单个对象从一个模式移动到另一个模式:
ALTER SCHEMA NewSchema TRANSFER OldSchema.Object;
我已经结合了上面的两个代码,并使用游标不受stringvariables的大小限制,单独执行命令。 我假设你已经创build了新的模式,并且在certificate一切正常后将会删除旧模式。 更安全… 🙂
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 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
执行过程来重命名模式:例子:
EXECUTE RenameSchema 'oldname','newname' EXECUTE RenameSchema 'dbo','guest'
程序
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 @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
对我来说最简单的解决scheme是:
我只有一个架构dbo与PopulationByCountrySTG
和CountryRegionSTG
两个表
(1)我创build了一个新的模式,
create schema stg
(2)我执行了下面的命令,
ALTER SCHEMA stg TRANSFER dbo.PopulationByCountrySTG; ALTER SCHEMA stg TRANSFER dbo.CountryRegionSTG;
全做完了。 让我知道,如果它适合你..谢谢你。