복붙노트

[SQL] 그것은 (SQL Server 내) 트랜잭션 내부의 여러 DDL 문을 실행할 수 있습니까?

SQL

그것은 (SQL Server 내) 트랜잭션 내부의 여러 DDL 문을 실행할 수 있습니까?

이 트랜잭션 내부에 여러 DDL 문을 실행할 수 있는지 궁금 하군요. 나는 특별히 다른 데이터베이스 (적어도 오라클, PostgreSQL을)에 대한 답변도 재미있을 수있다하더라도, SQL 서버에 관심이 있어요.

나는 일부는 "테이블 만들기"및 트랜잭션 내부에 생성 된 테이블의 "VIEW 만들기"일을하고 일부 불일치있을 것 같습니다과 DDLs 트랜잭션 내부에서 수행해서는 안 궁금 해요 봤는데 ...

아마 트랜잭션 외부에서 DDL을 움직일 수 있지만, 나는이에 대한 몇 가지 기준을 좀하고 싶습니다. 내가이를 지금까지 발견 :

Oracle의 경우 :

뭔가를 중요한 경우, 나는 JTDS JDBC 드라이버를 통해 자바와 함께이 일을하고 있습니다.

B.R. Touko

해결법

  1. ==============================

    1.나는 대부분의 데이터베이스가 제한이 알고 있지만, 포스트 그레스하지 않습니다. 성공 COMMIT 당신은 트랜잭션의 모든 번호 테이블 창조, 열 변화와 인덱스 변경을 실행할 수 있으며, 변경 사항이 다른 사용자 장치에 표시되지 않습니다. 즉 데이터베이스가 어떻게해야입니다! :-)

    나는 대부분의 데이터베이스가 제한이 알고 있지만, 포스트 그레스하지 않습니다. 성공 COMMIT 당신은 트랜잭션의 모든 번호 테이블 창조, 열 변화와 인덱스 변경을 실행할 수 있으며, 변경 사항이 다른 사용자 장치에 표시되지 않습니다. 즉 데이터베이스가 어떻게해야입니다! :-)

    SQL Server에 대한로서 당신은 트랜잭션의 DDL의 내부를 실행할 수 있지만 SQL 서버 버전 메타 데이터를하지 않습니다, 그리고 변화는 트랜잭션 커밋하기 전에 다른 사용자가 볼 것 때문에. 그러나 당신이 트랜잭션의 경우 일부 DDL 문은 롤백 할 수 있지만,있는 사람은 일을하고 당신은 몇 가지 테스트를 실행하기 위해 어떤 것들을해야하지 않습니다.

  2. ==============================

    2.당신은 (테이블 변수 또는 임시 테이블 제외) 즉시 등 테이블, 뷰를 작성하는 경우, 당신은 정말 당신의 디자인을 재고해야 할 수도 있습니다. 이것은 일반적으로 사용자 인터페이스에서 발생해야하는 물건이 아니다. 일부 사용자 정의를 허용해야하더라도, DDL 문은 트랜잭션 삽입 / 업데이트 / 삭제 실행과 동시에 발생되어서는 안된다. 이들 기능을 분리하는 것이 훨씬 낫다.

    당신은 (테이블 변수 또는 임시 테이블 제외) 즉시 등 테이블, 뷰를 작성하는 경우, 당신은 정말 당신의 디자인을 재고해야 할 수도 있습니다. 이것은 일반적으로 사용자 인터페이스에서 발생해야하는 물건이 아니다. 일부 사용자 정의를 허용해야하더라도, DDL 문은 트랜잭션 삽입 / 업데이트 / 삭제 실행과 동시에 발생되어서는 안된다. 이들 기능을 분리하는 것이 훨씬 낫다.

    이것은 또한 건강한 고려의 복용량과 두 명의 사용자가 동시에 같은 테이블의 구조를 변경 한 다음 데이터를 삽입하는 트랜잭션을 실행하려고하면 어떻게되는지에 관한 테스트를 필요로 무언가이다. 당신은 사용자가 데이터베이스 구조에 대한 조정을 할 수 있도록 할 때 발생할 수있는 몇 가지 정말 무서운 물건이있다.

    또한 일부 DDL 문은 항상 일괄 처리의 첫 번째 문이어야합니다. 당신이 그들을 실행하는 경우도 그를 찾아보십시오.

  3. ==============================

    3.일반적인 경우와 IIRC의 경우, DDL 문이 트랜잭션 있다고 가정하는 것이 안전하지 않습니다.

    일반적인 경우와 IIRC의 경우, DDL 문이 트랜잭션 있다고 가정하는 것이 안전하지 않습니다.

    말 즉, 상호 작용, 트랜잭션 (transaction) 방법 스키마 변경에 여유 상당한있다 (이것은 전혀하지 가정). 이 공급 업체 또는 특정 설치로 할 수있다 (즉, DBA까지) 저는 믿습니다. 그래서 적어도, DDL 문 발언권을 취급하는 다른 사람을 생각하는 하나의 DBMS를 사용하지 마십시오.

    편집 : MySQL이 전혀 DDL 트랜잭션을 지원하지 않는 DBMS의 예입니다. 또한 데이터베이스 복제 / 미러링이있는 경우, 당신은 (, 사이베이스의 복제가 규범 믿거 나 말거나) 복제 서비스가 매우 조심해야합니다 실제로 DDL 문을 복제합니다.

  4. ==============================

    4.그것은 DDL 및 DML 문을 실행할 때 MS SQL에서, 암시 적 트랜잭션이 트리거되도록 할 수있다. 당신이 전환되면이 떨어져이 도움말, 사용합니까      SET IMPLICIT_TRANSACTIONS

    그것은 DDL 및 DML 문을 실행할 때 MS SQL에서, 암시 적 트랜잭션이 트리거되도록 할 수있다. 당신이 전환되면이 떨어져이 도움말, 사용합니까      SET IMPLICIT_TRANSACTIONS

    편집 : 또 다른 가능성  - 동일한 배치의 다른 문과 CREATE VIEW를 결합 할 수 없습니다. 표 괜찮 CREATE. 당신은 GO와 배치를 구분합니다.

    EDIT2가 : 다른 배치를 만들 GO로 구분 같이 오랫동안 같이 트랜잭션에 여러 DDL을 사용할 수 있습니다.

  5. from https://stackoverflow.com/questions/1043598/is-it-possible-to-run-multiple-ddl-statements-inside-a-transaction-within-sql-s by cc-by-sa and MIT license