복붙노트

[SQL] 이름 바꾸기 SQL 서버 스키마

SQL

이름 바꾸기 SQL 서버 스키마

어떻게 SQL Server를 사용하여 스키마의 이름을 바꿀 수 있습니까?

해결법

  1. ==============================

    1.당신이 스키마에 많은 수의 개체가있는 경우, 당신은 (그것은 단지 당신이 그것을 실행하기 전에 그래서, 당신의 SP에, UDF의 등을 확장해야 할 수도 있습니다, 테이블과 뷰를 않습니다 자동으로 모든 변경 사항을 생성하기 위해이 같은 것을 사용할 수 있습니다 .)

    당신이 스키마에 많은 수의 개체가있는 경우, 당신은 (그것은 단지 당신이 그것을 실행하기 전에 그래서, 당신의 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)
    
  2. ==============================

    2.당신은 하나의 스키마를 통해 다른 개별 개체를 이동 :

    당신은 하나의 스키마를 통해 다른 개별 개체를 이동 :

    ALTER SCHEMA NewSchema TRANSFER OldSchema.Object;
    
  3. ==============================

    3.I 개별적으로 명령을 실행하는 문자열 변수의 크기에 의해 한정되지 않으며하기 모두 상기 코드 및 사용 된 커서를 결합했다. 나는 이미 새로운 스키마를 생성 한 모든 괜찮 인증 후 이전을 삭제합니다 가정합니다. 그것은 안전합니다 ... :)

    I 개별적으로 명령을 실행하는 문자열 변수의 크기에 의해 한정되지 않으며하기 모두 상기 코드 및 사용 된 커서를 결합했다. 나는 이미 새로운 스키마를 생성 한 모든 괜찮 인증 후 이전을 삭제합니다 가정합니다. 그것은 안전합니다 ... :)

    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
    
  4. ==============================

    4.저장 프로 시저가 SQL Server 2008의 더 테이블이 스키마 이름을 바꾸려면

    저장 프로 시저가 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'  
    
  5. ==============================

    5.절차는

    절차는

    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)
    
  6. ==============================

    6.이것은 짧은 버전이지만 잘 작동합니다.

    이것은 짧은 버전이지만 잘 작동합니다.

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

    7.나를 위해 일한 것이 가장 쉬운 솔루션입니다 : 나는 두 개의 테이블 PopulationByCountrySTG 및 CountryRegionSTG와 하나의 스키마 DBO가

    나를 위해 일한 것이 가장 쉬운 솔루션입니다 : 나는 두 개의 테이블 PopulationByCountrySTG 및 CountryRegionSTG와 하나의 스키마 DBO가

    (1) I이 실행하여 새로운 스키마를 생성

    create schema stg
    

    (2) 나는 다음 명령을 실행

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

    모든 다. 당신 .. 감사 녀석을 위해 작동하는지 알려주세요.

  8. from https://stackoverflow.com/questions/316485/rename-sql-server-schema by cc-by-sa and MIT license