SSDT 재구성 로그

5926 단어 sql
SSDT는 소스 코드에서 SQL 모드를 제어하는 데 사용되는 도구입니다.

SSDT의 작동 방식


그것의 작업 원리는 거의 예상한 작업 원리와 같습니다. 스크립트를 만들어서 대상을 정의합니다.이 스크립트를 발표할 수 있습니다. 이것은 본질적으로 구축된 것입니다.Dacpac 이dacpac를 사용하여 구축 중인 내용과 목표 데이터베이스에 있는 내용을 구분하고 스크립트를 만들어서 차이를 해결합니다.

SqlPackage 함정.


큰 문제가 하나 있습니다.상술한 과정은dacpac의 대상과 목표 데이터베이스의 대상을 일치시킬 수 있는 것에 의존한다.만약 시계의 이름을 바꾸면, [RenamedTableName]과 [TableName]가 같은 시계라는 것을 어떻게 알 수 있습니까?SqlPackage의 관점에서 볼 때 [TableName]은 삭제되고 [RenamedTableName]는 생성되었다고 볼 수 있습니다.(당신이 알려주지 않으면 정말 내려놓지 않겠지만, 그것은 다른 블로그입니다)

솔루션


해결 방안은 어떤 재구성이 발생할 때 더욱 명확해진다.dacpac은 SqlPackage가 시각적으로 이해할 수 없는 재구성 명령을 제공합니다.
이러한 두 가지 메커니즘이 있습니다.
  • 에 서명한 <projectName>.refactorlog 파일로 재구성 기록
  • 에 사용
  • 추적 데이터베이스
  • 에서 어떤 재구성이 실행되었는지 __RefactorLog

    . 로그 파일 재구성

    .refactorlog 파일은 XML로 구성되어 있으며 주로 <Operation> 요소의 목록입니다.하나하나가 하나의 단독적인 재구성을 대표한다.
    <Operation Name="Rename Refactor" Key="3a7b06a1-5e83-47f9-95d7-2a2fbaf2a20e" ChangeDateTime="06/10/2021 15:16:10">
      <Property Name="ElementName" Value="[dbo].[Country]" />
      <Property Name="ElementType" Value="SqlTable" />
      <Property Name="ParentElementName" Value="[dbo]" />
      <Property Name="ParentElementType" Value="SqlSchema" />
      <Property Name="NewName" Value="[CountryInfo]" />
    </Operation>
    
    위에는 표 Country 의 이름을 CountryInfo 로 바꾸는 재구성 예가 있다.이 항목의 문법을 배우는 것에 대해 너무 걱정하지 않습니다. 만약 VisualStudio에서 SSDT를 사용한다면, 이 항목들을 만들어 줄 것입니다.

    로그 테이블 재구성


    이것은 매우 간단한 표로 이미 운행한 재구성만 기록한다.데이터베이스에 dcpac를 배치하면 자동으로 생성됩니다.
    이것은 guid 목록만 포함하는 열OperationKey만 있습니다.위에 표시된 작업 항목Key 필드에 표시되는 GUID입니다.
    dcpac를 배치할 때, 실행 중인 모든 재구성으로 이 표를 채워서, 같은 재구성을 시도할 때마다 (대부분의 경우 실패할 수 있습니다).

    예.


    다음은 열 이름을 바꾸는 간단한 예이다.나는 매우 간단한 SSDT 프로젝트를 시작했는데, 그 중에는 표가 하나밖에 없다.
    CREATE TABLE [dbo].[Person]
    (
      [Id] INT NOT NULL PRIMARY KEY IDENTITY(1,1),
      [Name] NVARCHAR(64)
    )
    
    현재 로그를 재구성하지 않은 상태에서 테스트하기 위해서, 우리는 열 이름 Name 을 바꾸기만 하면 된다.
    CREATE TABLE [dbo].[Person]
    (
      [Id] INT NOT NULL PRIMARY KEY IDENTITY(1,1),
      [FullName] NVARCHAR(64)
    )
    
    Visual Studio의 게시 창에서 수행할 수 있는 스크립트를 생성합니다.
    /*
    The column [dbo].[Person].[Name] is being dropped, data loss could occur.
    */
    IF EXISTS (select top 1 1 from [dbo].[Person])
        RAISERROR (N'Rows were detected. The schema update is terminating because data loss might occur.', 16, 127) WITH NOWAIT
    GO
    PRINT N'Altering [dbo].[Person]...';
    GO
    ALTER TABLE [dbo].[Person] DROP COLUMN [Name];
    GO
    ALTER TABLE [dbo].[Person]
        ADD [FullName] NVARCHAR (64) NULL;
    GO
    
    분명히 이것은 우리가 원하는 것이 아니다.
    수동 변경 사항을 취소하고 Visual Studio 재구성 옵션을 사용합니다(수동으로 재구성 로그를 만드는 것이 아니라 이 옵션을 사용하는 것이 좋습니다.또한 인용 이름표/열의 저장 프로세스, 함수, 보기 등을 자동으로 업데이트합니다.

    이것은 현재 ExampleDatabase.refactorlog (첫 번째 재구성이기 때문에) 하나의 조작 항목만 만들었습니다.
    <Operation Name="Rename Refactor" Key="0517c5b8-8ae1-4642-ba65-9465fa2daf3c" ChangeDateTime="06/10/2021 15:36:05">
      <Property Name="ElementName" Value="[dbo].[Person].[Name]" />
      <Property Name="ElementType" Value="SqlSimpleColumn" />
      <Property Name="ParentElementName" Value="[dbo].[Person]" />
      <Property Name="ParentElementType" Value="SqlTable" />
      <Property Name="NewName" Value="[FullName]" />
    </Operation>
    
    스크립트를 다시 생성합니다.
    GO
    PRINT N'The following operation was generated from a refactoring log file 0517c5b8-8ae1-4642-ba65-9465fa2daf3c';
    PRINT N'Rename [dbo].[Person].[Name] to FullName';
    GO
    EXECUTE sp_rename @objname = N'[dbo].[Person].[Name]', @newname = N'FullName', @objtype = N'COLUMN';
    GO
    -- Refactoring step to update target server with deployed transaction logs
    IF OBJECT_ID(N'dbo.__RefactorLog') IS NULL
    BEGIN
        CREATE TABLE [dbo].[__RefactorLog] (OperationKey UNIQUEIDENTIFIER NOT NULL PRIMARY KEY)
        EXEC sp_addextendedproperty N'microsoft_database_tools_support', N'refactoring log', N'schema', N'dbo', N'table', N'__RefactorLog'
    END
    GO
    IF NOT EXISTS (SELECT OperationKey FROM [dbo].[__RefactorLog] WHERE OperationKey = '0517c5b8-8ae1-4642-ba65-9465fa2daf3c')
    INSERT INTO [dbo].[__RefactorLog] (OperationKey) values ('0517c5b8-8ae1-4642-ba65-9465fa2daf3c')
    GO
    
    이것은 예기한 결과다.

    롤백 재구성


    언제든지, 나는 Dacpac 배치를 스크롤하는 것에 관한 문장을 한 편, 또는 더 정확히 말하면, 어떻게 하면 Dacpac 배치를 스크롤할 수 없는지에 관한 문장을 한 편 보낼 것이다.
    그러나 여기서 언급할 만한 것은 재구성 로그의 변경을 취소할 수 있는 메커니즘이 사실상 없다는 것이다.낡은 dcpac를 간단하게 배치해서 재구성을 취소할 수는 없다. 재구성을 취소할 줄도 모른다.
    재구성 로그를 취소하는 가장 좋은 (가장 안전하고 구조화되며 제어할 수 있는) 메커니즘은 새로운 재구성을 만들어서 재구성을 취소하고, 업데이트된dacpac를 통해 배치하는 것이다.SSDT는 항상 구축을 앞으로 추진합니다. 설령 '앞으로 추진' 이 이전의 '앞으로 추진' 변경 사항을 철회하더라도.
    긴급하고 과열된 상황에서 수동으로 __RefactorLog표에서 삭제하고 수동으로 패턴 변경을 취소하는 사람으로서 수동 관리__RefactorLog가 가져올 수 있는 잠재적인 복잡성은'취소'재구성 로그를 계속 실행하는 것보다 위험을 무릅쓸 필요가 거의 없다고 확신할 수 있다.

    좋은 웹페이지 즐겨찾기