2010-06-05 3 views
1

SQL Server 2005를 사용하고 관계를 하나의 테이블로 이동해야합니다. 나는 같은 테이블에 2 명의 관계가 있기 때문에 "Enfor Foreign Key Constraints"를 해제해야했습니다.SQL Server 2005, 외래 키 제약 조건 적용 및 계단식 삭제

그러나 캐스케이드 삭제를 적용하고 싶습니다.

이 관계 둘 모두에서 계단식 삭제를 수행하고 이러한 테이블에서 삭제 된 것을 말하면 다른 테이블에 계단식으로 삭제 될 것이라고 생각했습니다.

그러나 나는 그런 식으로 작동하지 않는 것 같아서 foriegn 키 제약 조건을 가지고 있기 때문에 궁금합니다.

이 경우 어떻게 해결할 수 있습니까?

+4

나는 계단식 삭제를 사용하지 않는 경향이 있습니다. 너무 위험합니다. 대신, 나는 계단식 삭제 작업을 명시 적으로 수행하는 응용 프로그램을 선호합니다. –

+0

@Mitch Wheat, 그 문제는 때로는 물건이 응용 프로그램 외부에서 수행된다는 것입니다. 부차적 인 테이블 같은 것들에 대해서도 말이됩니다. –

+0

@nathan gonzalez 일반적으로 삭제를 허용하지 않습니다 (단순히 행을 비활성화하는 것). 계단식 동작이 필요한 경우 저장된 proc 또는 테이블/뷰의 트리거에 의해 처리됩니다. 대부분의 로그인에 테이블에 대한 직접 액세스, 특히 삭제를 허용하지 않는 것이 좋습니다. 이렇게하면 지정된 데이터베이스 컨트롤 경계 외부의 작업도 중지됩니다. –

답변

2

계단식 삭제를 적용하려면 fk 제약 조건이 있어야합니다. 어떻게 SQL 서버가 그렇지 않으면 삭제 해야할지 알고 있습니까?

2

처음에는 외래 키 제약 조건을 해제해야하는 이유가 명확하지 않습니다. 참조 무결성을 강화하는 동일한 테이블에 대해 많은 관계를 가질 수 있습니다. 그러나 동일한 하위 테이블에서 동일한 상위 테이블과 두 개의 관계가있는 경우 해당 하위 테이블 중 하나에서만 계단식 업데이트 또는 계단식 삭제를 사용할 수 있습니다.

TBH, 나는 관계를 원하지만 상황을 강요하지 않을 상황을 생각할 수 없다. 데이터가 손상되지 않도록 항상 데이터를 수정하고 관계를 적용해야합니다.

실제로 저장 프로 시저를 통한 데이터 액세스가 도움이되는 상황입니다. 사용자가 저장 프로 시저를 통해서만 삭제하도록 강요하는 경우 DRI에서 시행하지 않고도 프로 시저에서 계단식 삭제를 적용 할 수 있습니다.

2

SQL 서버는 여러 개의 계단식 경로를 허용하지 않습니다. 이 문제를 해결하려면 각 추가 경로에 'FOR DELETE'트리거를 추가하십시오.

ALTER TRIGGER [dbo].[trgMyTriggerName] ON [dbo].[tblMyTable] FOR DELETE AS 
SET NOCOUNT ON 
DELETE FROM tblMySubTable 
WHERE MySubTable_Parent_ID IN (SELECT MyTable_ID FROM deleted) 

당신은 여전히 ​​없음에 '외래 키 제약 조건을 적용'및 삭제 규칙을 만들고 업데이트 규칙 아무런 작업을하지 설정, 외부 키를 추가 할 것입니다. 이것은 당신이 외래 키 (intellisense, 엔티티 프레임 워크 등)의 모든 장점을 사용할 수 있습니다.

관련 문제