SQL Server 스키마 이름 바꾸기
SQL Server를 사용하여 스키마의 이름을 변경하려면 어떻게 해야 합니까?
스키마에 개체 수가 많은 경우 이와 같은 방법을 사용하여 모든 변경 사항을 자동으로 생성할 수 있습니다(테이블 및 보기만 수행하므로 실행하기 전에 SP, UDF 등으로 확장해야 할 수도 있습니다).
USE SandBox
DECLARE @OldSchema AS varchar(255)
DECLARE @NewSchema AS varchar(255)
DECLARE @newLine AS varchar(2) = CHAR(13) + CHAR(10)
SET @OldSchema = 'dbo'
SET @NewSchema = 'StackOverflow'
DECLARE @sql AS varchar(MAX)
SET @sql = 'CREATE SCHEMA [' + @NewSchema + ']' + @newLine
SELECT @sql = @sql + 'GO' + @newLine
SELECT @sql = @sql + 'ALTER SCHEMA [' + @NewSchema + '] TRANSFER [' + TABLE_SCHEMA + '].[' + TABLE_NAME + ']'
+ @newLine
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;
위의 두 코드를 결합하여 문자열 변수의 크기에 제한되지 않도록 커서를 사용하여 명령을 개별적으로 실행했습니다.새 스키마를 이미 생성했으며 모든 것이 정상임을 확인한 후 이전 스키마를 삭제할 것입니다.그게 더 안전해요...:)
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'
이것은 짧은 버전이지만 잘 작동합니다.
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
프로시저의 경우
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)
가장 쉬운 해결책은 다음과 같습니다.
테이블이 두 개인 스키마 디보가 하나뿐입니다.PopulationByCountrySTG
그리고.CountryRegionSTG
실행하여 새 스키마를 만들었습니다.
create schema stg
다음 명령을 실행했습니다.
ALTER SCHEMA stg TRANSFER dbo.PopulationByCountrySTG;
ALTER SCHEMA stg TRANSFER dbo.CountryRegionSTG;
다 됐습니다.그게 당신에게 효과가 있다면 제게 알려주세요.여러분 감사합니다.
언급URL : https://stackoverflow.com/questions/316485/rename-sql-server-schema
'programing' 카테고리의 다른 글
'System' 유형입니다.개체'가 참조되지 않는 어셈블리에 정의되었습니다. (0) | 2023.07.08 |
---|---|
mongodb 또는 cassandra를 사용한 공간 데이터 (0) | 2023.07.08 |
선형 회귀 분석에서 p-값 및 r-값 추출 (0) | 2023.07.08 |
Oracle IN 절에서 LIKE 사용 (0) | 2023.07.03 |
주문 기준 조항에 대한 명세서를 작성한 경우 (0) | 2023.07.03 |