다중 문 트랜잭션 내에서 ALTER DATABASE 문을 사용할 수 없습니다


13

나는에서 인 - 메모리 샘플을 기반으로하여 AdventureWorks 다운로드 한 여기를 , 및 첨부 문서에 설명 된 모든 단계를 따랐다. 그러나 SQL Server Management Studio에서 스크립트를 실행하려고하면 오류 메시지가 나타납니다.

다중 문 트랜잭션 내에서 ALTER DATABASE 문을 사용할 수 없습니다

오류는 9 행을 가리키며 다음과 같습니다.

IF NOT EXISTS (SELECT * FROM sys.data_spaces WHERE type='FX')
    ALTER DATABASE CURRENT ADD FILEGROUP [AdventureWorks2012_mod] 
    CONTAINS MEMORY_OPTIMIZED_DATA
GO

이 문서는 공식 Microsoft 문서이므로 어느 정도 잘못되었다고 가정하지만 그 내용을 파악할 수 없습니다.

답변:


13

아니요, 당신은 잘못한 것이 없습니다. 나는 같은 것을 얻었다. 샘플을 여러 스크립트로 나누고 하나의 큰 스크립트 대신 자체 쿼리 창에서 스크립트의 각 섹션을 순차적으로 실행하여 문제를 해결했습니다. 이것은 항상 프로덕션 서버가 아닌 격리 된 VM에서 이러한 샘플을 실행하고 있기 때문에 내 경우에만 효과가 있었고 여기에 유일한 사람이기 때문에 트랜잭션 처리가 필요하지 않습니다.

오늘 스크립트를 더 자세히 살펴보면 명시 적으로 정의 된 트랜잭션 처리가 없지만 스크립트를 이미 활성 트랜잭션이있는 쿼리 창에 붙여 넣거나 자동으로 BEGIN TRANSACTION; / COMMIT TRANSACTION;문을 추가하는 새 쿼리 창을 만들었을 수 있습니다.

나는 또한 이 블로그 포스트 에서 두 가지 다른 잠재적 문제점을 지적했다 .


1
"아마도 이미 활성화 된 트랜잭션이있는 쿼리 창에 스크립트를 붙여 넣었을 것입니다."전체 쿼리를 새 창에서 실행했을 때 문제가 발생한 것 같습니다.
Petter Brodin

9

@AaronBertrand에 동의합니다. 아무 잘못하지 않았습니다. 버그가있는 Microsoft 스크립트를 본 것은 이번이 처음이 아닙니다. 현실적으로 많은 스크립트를 게시 할 때 나는 전혀 보지 못하는 것에 놀랐습니다.

특히 문제는 ALTER DATABASE트랜잭션에서 전혀 허용되지 않는다는 것입니다. 여기서 BOL 참조를 볼 수 있습니다. 트랜잭션에서 허용되는 Transact-SQL 문

사실 이것은 간단한 스크립트조차도 같은 오류로 실패합니다.

BEGIN TRANSACTION
ALTER DATABASE AdventureWorks2012 SET READ_WRITE
COMMIT

Aaron이 말했듯이, 트랜잭션 처리 (또는 적어도 ALTER DATABASE트랜잭션 의 명령문)를 제거하면 괜찮을 것입니다.


-2

"이동"을 사용하여 거래를 분리하십시오. 문제가 해결됩니다. (하나씩 실행하는 것보다 쉽습니다.) 또한 격리 수준을 변경할 수 있습니다 (테스트되지 않음)

SET TRANSACTION ISOLATION LEVEL SERIALISABLE

Begin tran

---Statements goes here

commit tran

SET TRANSACTION ISOLATION LEVEL READ COMMITTED

ALTER DATABASE트랜잭션 내에서 수행 할 수없는 다른 사용자가 이미 식별 한 경우 게시하기 전에 코드를 테스트 할 수 있습니다. 격리 수준을 SERIALIZABLE설정해도 영향을 미치지 않습니다.
Max Vernon

"GO"는 SQL 문이 아닙니다. SSMS에게 선행 설명을 SQL Server에 일괄 적으로 제출하라는 지시입니다. 용감하다고 생각되면 도구-> 옵션-> 쿼리 실행-> SQL Server와 같이 변경할 수 있습니다. 단일 거래 내에서 많은 배치를 제출할 수 있습니다.
Michael Green
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.