2011-02-14 5 views
1

나는이 어리석은 질문에 대해 미리 사과하지만 아래에 표시된 코드에서 CREATE TABLE이 롤백되지 않는 이유를 알 수 없습니다. 나는 CREATE DATABASE, CREATE FULLTEXT CATALOG, CREATE FULLTEXT INDEX를 사용자 정의 트랜잭션과 함께 지정할 수 없다는 것을 알고 있습니다. SSMS 내의 테이블 폴더는이 코드를 실행하는 동안 잠긴다는 점에 유의하십시오.CREATE TABLE 명령이 사용자 정의 트랜잭션에서 작동하지 않는 이유는 무엇입니까?

BEGIN TRANSACTION T1 
CREATE TABLE temp 
(
chisla char(1) 
) 

SELECT count(chisla) AS Count, chisla AS My_Numbers 
FROM temp 
--GROUP BY chisla 
ORDER BY chisla 

drop table temp 
COMMIT TRANSACTION T1 
GO 
+0

어떤 오류가 발생합니까? –

+2

내가 볼 수 있듯이이 스크립트는 시작되지 않아야합니다. GROUP BY를 사용하지 않고 집계 된 열과 집계되지 않은 열을 혼합하므로 스크립트를 실행하기 전에 오류 메시지가 나타납니다. –

+0

메시지 8120, 수준 16, 상태 1, 줄 7 'temp.chisla'열은 집계 함수 또는 GROUP BY 절에 포함되어 있지 않기 때문에 선택 목록에서 유효하지 않습니다. –

답변

3

당신은 롤백을 말하지 않았다. JNK는 트래핑 할 수있는 오류가 발생할 경우 트랜잭션을 롤백하기 위해 try Catch를 수행하는 방법을 보여줍니다. 그러나이 경우 잘못된 SQL을 사용하면 트랩 할 수없는 오류이므로 어떤 이벤트에서든 롤백되지 않습니다. 트랜잭션이 올바르게 작동하려면 SQl에서 올바른 구문을 사용해야하며, 이는 동적 SQl이 완전히 테스트 할 수 없으므로 매우 위험 할 수있는 한 가지 이유입니다.

어쨌든 이처럼 비행 중에 테이블을 만드는 것은 나쁜 습관입니다. 일시적으로 원하는 경우 임시 테이블이나 테이블 변수를 사용하고 작업이 실패하면 만들기를 롤백 할 영구 테이블을 만들지 마십시오.

+0

+1 - 경우에 따라 구체화 된 임시 테이블이 이점이 될 수 있습니다 (예 : tempdb에서 많은 활동을하는 공유 서버에서 큰 테이블이 필요한 경우). – JNK

+0

테이블 대신 임시 테이블의 경우 결과는 완전히 동일합니다. 원래는 #temp 였고 여기에 다른 버전의 코드를 삽입했습니다. 그러나 어쨌든 저는 당신의 대답에서 내가 필요로하는 것을 발견했습니다, 감사합니다. –

0

나는 TRY...CATCH 블록을 원한다고 생각합니다. 아주 좋은 설명 here on msdn.

하지만, 간단한 예를 들어 있습니다 :

BEGIN TRY 
    BEGIN TRANSACTION 
    ...your code... 
    COMMIT TRANSACTION 
END TRY 
BEGIN CATCH 
    ...error reporting code here... 
    ROLLBACK TRANSACTION 
END CATCH; 
+0

올바르게 롤백 코드를 설정하는 방법을 보여주는 멋진 코드. 그러나이 오류는 트래핑 할 수없는 오류이므로 문제가 발생하지 않습니다. 이 코드를 시도하고 당신이 표시됩니다 이 테이블 dbo.rollbacktest (테스트 int)를 SELECT COUNT (*)를 만들 트란 시작하려고 시작, 테스트 dbo.rollbacktest에서 이 는 캐치에게 롤백 트란을 시작하려고 트란 끝을 커밋 인쇄 '롤백' select * dbo.rollbacktest end catch; --drop table dbo.rollbacktest – HLGEM

관련 문제