내 상황은 다음과 같습니다
테이블 STOCK_ARTICLES :
ID *[PK]*
OTHER_DB_ID
ITEM_NAME
테이블 위치 :
ID *[PK]*
LOCATION_NAME
WORK_PLACE 테이블 :
ID *[PK]*
WORKPLACE_NAME
INVENTORY_ITEMS 테이블 :
ID *[PK]*
ITEM_NAME
STOCK_ARTICLE *[FK]*
LOCATION *[FK]*
WORK_PLACE *[FK]*
INVENTORY_ITEMS의 3 개의 FK는 각각 다른 테이블의 "ID"열을 참조합니다.
여기에 관련된 테이블은 STOCK_ARTICLE 및 INVENTORY_ITEMS입니다.
이제 위에서 언급 한 데이터베이스 를 다른 데이터베이스 (OTHER_DB) 와 "동기화"하는 여러 단계 (SQL 스크립트)로 구성된 SQL 작업이 있습니다 . 이 작업의 단계 중 하나는 "정리"입니다. 동일한 데이터베이스 ID를 가진 다른 데이터베이스에 해당 레코드가없는 STOCK_ITEMS에서 모든 레코드를 삭제합니다. 다음과 같이 보입니다 :
DELETE FROM STOCK_ARTICLES
WHERE
NOT EXISTS
(SELECT OTHER_DB_ID FROM
[OTHER_DB].[dbo].[OtherTable] AS other
WHERE other.ObjectID = STOCK_ARTICLES.OTHER_DB_ID)
그러나이 단계는 항상 실패합니다.
DELETE 문이 REFERENCE 제한 조건 "FK_INVENTORY_ITEMS_STOCK_ARTICLES"와 충돌했습니다. 데이터베이스 "FIRST_DB", 테이블 "dbo.INVENTORY_ITEMS", 열 'STOCK_ARTICLES'에서 충돌이 발생했습니다. [SQLSTATE 23000] (547 오류) 명령문이 종료되었습니다. [SQLSTATE 01000] (오류 3621). 단계가 실패했습니다.
따라서 문제는 INVENTORY_ITEMS에서 참조 할 때 STOCK_ARTICLES에서 레코드를 삭제할 수 없다는 것입니다. 그러나이 정리가 작동해야합니다. 즉, STOCK_ITEMS에서 삭제해야 할 레코드를 먼저 식별하기 위해 정리 스크립트를 확장해야하지만 해당 ID가 INVENTORY_ITEMS 내부에서 참조되기 때문에 정리 스크립트를 확장해야합니다. 그런 다음 먼저 INVENTORY_ITEMS 내의 레코드를 삭제 한 후 STOCK_ARTICLES 내의 레코드를 삭제해야합니다. 내가 맞아? 그러면 SQL 코드는 어떻게 생겼습니까?
감사합니다.
INVENTORY_ITEMS
두DELETE
s 사이에 오류가 새로 추가 된 것으로 볼 수 있습니다 .