나는 (현재) 모두 SQL Server 2000 및 SQL Server 2005SQL Server 2000에서 2005 로의 SET IDENTITY_INSERT 동작의 차이점은 무엇입니까?
에서 제공하는 DB를 내가 다른 하나 개의 서버에서 프로그래밍 방식으로 DB를 이동하기 위해 노력하고있어 사용합니다해야하는 응용 프로그램이 있습니다. 내가 사용하는 모든 테이블에는 자동 증가되는 기본 키가 있습니다. 이러한 자동 증가 키는 다른 테이블에서 외래 키로 사용되므로 표를 복사하는 공격 계획은 대상 테이블의 자동 증가를 일시적으로 해제하고 원래의 기본 키를 사용하여 레코드를 그대로 삽입 한 다음 자동으로 전환하는 것입니다. - 증가 다시. 만약 내가 제대로 이해하고
, 나는의 System.Data.SQLClient를 사용하여 VB 2005 년 내 구현은
SET IDENTITY_INSERT tbl_Test ON;
...
SET IDENTITY_INSERT tbl_Test OFF;
을 실행하여 한 번에 하나 개의 테이블 "온/오프 자동 증가를 설정"할 수 있습니다.
간략하게하기 위해 SQL 쿼리 생성과 관련된 코드 줄만 보여 드리겠습니다. 에
Dim insertRegularStatement As String = _
"INSERT INTO tbl_Test (TestData) VALUES (42);"
Dim insertRegularCommand As New SqlCommand(insertRegularStatement, connection)
insertRegularCommand.ExecuteNonQuery()
: 기본 키를 지정하지 않고,
Dim turnOffIdentInsertStatement As String = _
"SET IDENTITY_INSERT tbl_Test OFF;"
Dim turnOffIdentInsertCommand As New SqlCommand(turnOffIdentInsert, connection)
turnOffIdentInsertCommand.ExecuteNonQuery()
Dim turnOnIdentInsertStatement As String = _
"SET IDENTITY_INSERT tbl_Test ON;"
Dim turnOnIdentInsertCommand As New SqlCommand(turnOnIdentInsert, connection)
turnOnIdentInsertCommand.ExecuteNonQuery()
일반적으로 새로운 레코드를 삽입하려면 :
Dim createTableStatement As String = _
"CREATE TABLE tbl_Test (" & _
"ID_Test INTEGER PRIMARY KEY IDENTITY," & _
"TestData INTEGER" & _
")"
Dim createTableCommand As New SqlCommand(createTableStatement, connection)
createTableCommand.ExecuteNonQuery()
가 또는 해제 IDENTITY_INSERT를 켜려면 :
테이블을 만들려면 명시 적 기본 키를 사용하여 새 레코드 삽입 :Dim insertWithIDStatement As String = _
"INSERT INTO tbl_Test (ID_Test, TestData) VALUES (20, 42);"
Dim insertWithIDCommand As New SqlCommand(insertWithIDStatement, connection)
insertWithIDCommand.ExecuteNonQuery()
내 계획은 IDENTITY_ INSERT를 켜고 명시적인 기본 키가있는 레코드를 추가 한 다음 IDENTITY_ INSERT를 해제하는 코드를 호출하는 것입니다.
이 방법은 내가 SQL Server 2000으로 이야기하고 때 잘 작동하는 것처럼 보이지만 제가 SQL 서버 2005에 대해 동일한 코드를하려고 할 때 예외로 실행 :
"Cannot insert explicit value for identity column in table 'tbl_Test' when IDENTITY_INSERT is set to OFF."
어떤 힌트를? 언제나처럼 미리 감사드립니다.
찾았습니다. 명령 사이에서 연결을 열거 나 닫는 중입니다. 또한 SqlBulkCopy를 가리켜 주셔서 감사합니다! – John
Ahh ... 우연히 암시 적 트랜잭션과 관련이 있습니까? –
David, 가능합니다. 나는 충분히 말할만큼 충분히 익숙하지 않다. – John