SSDT 재구성 로그
5926 단어 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
가 가져올 수 있는 잠재적인 복잡성은'취소'재구성 로그를 계속 실행하는 것보다 위험을 무릅쓸 필요가 거의 없다고 확신할 수 있다.
Reference
이 문제에 관하여(SSDT 재구성 로그), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/dealeron/the-ssdt-refactor-log-4jk6텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)