SQL Server DDL에서 트랜잭션을 사용하는 방법은 무엇입니까?


20

모든 삽입이 단일 저장 프로 시저로 수행되는 로그인 테이블이 있습니다.

CREATE TABLE dbo.LogTable(
    LogRefnr int IDENTITY(1, 1) NOT NULL,
    LogQuery varchar(255) NOT NULL,
    LogTime datetime NOT NULL,
    logQueryDuration int NULL,
    LogSessionID int NULL,
 CONSTRAINT PK_Log PRIMARY KEY CLUSTERED  (LogRefnr)
)
go


Create procedure DBO.LogInsert ( @Query varchar(255), @time datetime, @duration int, @SessinID int) as
begin
    Insert into LogTable ( LogRefnr, LogQuery, logQueryDuration, LogSessionID)
    Values  (@Query, @time, @duration, @SessinID);
end;
GO

현재 해당 테이블에 약 45500000 개의 행이 있으며 로깅을 다른 테이블로 보내려고합니다.

내 생각은 다음 스크립트를 사용하는 것입니다

begin Transaction

exec sp_rename LogTable, LogTableOld;

CREATE TABLE dbo.LogTable(
    LogRefnr int IDENTITY(46000000, 1) NOT NULL,            -- greater than select max(LogRefnr) from LogTableOld
    LogQuery varchar(255) NOT NULL,
    LogTime datetime NOT NULL,
    logQueryDuration int NULL,
    LogSessionID int NULL,
 CONSTRAINT PK_Log2 PRIMARY KEY CLUSTERED  (LogRefnr);
)
go

sp_recompile LogTable;
go

Commit;

이것이 작동하며 LogInsert를 호출하는 다른 프로 시저에 최소한의 영향을 미칩니 까?


2
sp_recompile이 필요하지 않습니다. dbo.LogTable 개체를 사용하는 개체에 대한 프로 시저 캐시는 개체 이름을 바꾸면 자동으로 만료됩니다.
mrdenny

답변:


24

예. 트랜잭션은 DDL 및 범위 일괄 처리에 적용됩니다.

나는 이런 식으로 할 것입니다. SERIALIZABLE ISOLATION을 사용하여 완전히 격리하고 XACT_ABORT를 사용하면 오류에 대한 롤백이 발생합니다.

SET XACT_ABORT ON
GO
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
GO
begin Transaction
GO
exec sp_rename LogTable, LogTableOld;
GO
CREATE TABLE dbo.LogTable(
    LogRefnr int IDENTITY(46000000, 1) NOT NULL,            -- greater than select max(LogRefnr) from LogTableOld
    LogQuery varchar(255) NOT NULL,
    LogTime datetime NOT NULL,
    logQueryDuration int NULL,
    LogSessionID int NULL,
 CONSTRAINT PK_Log2 PRIMARY KEY CLUSTERED  (LogRefnr);
)
go
EXEC sp_recompile LogTable;
go

Commit;

1
SQL Server 트랜잭션이 DDL 및 스팬 일괄 처리에 적용됨을 나타내는 참조에 연결할 수 있습니까? 명백한 BOL 페이지는 이 문제를 언급하지 않습니다.
Nick Chammas

2
@ 닉 : 나는 결코 하나를 찾지 못했습니다. 항상 사용하면서 작동한다는 것을 알고 있습니다. 나를 믿거 나 반증하거나 직접 시도해 보는 것은 당신에게 달려 있습니다. 물론, 거래는 내가 사용하는 다양한 세트 문과 같이 연결 당 입니다. 연결은 여러 배치로 구성됩니다. 더 필요한 게 뭐야?
gbn

나는 당신을 믿지만, 명시 적 거래와 관련된 모든 행동과 그렇지 않은 모든 행동을 열거하는 "공식적인"문서를 원했습니다. 예를 들어, 테이블 변수 는 트랜잭션 롤백의 영향을받지 않습니다 ( 최소한의 서프라이즈 원칙 위반 ).
Nick Chammas

2
거의 동일한 코드 있지만, 트랜잭션이 작동하지 않습니다 stackoverflow.com/questions/47868213/...
aleyush
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.