문제

설정하는 경우 외국에서 키 SQL Server,어떤 상황에서 해야 당신이 그것을 캐스케이드에서 삭제하거나 업데이트,그리고 무엇이 그 뒤 론?

이것은 아마에 적용되는 다른 데이터베이스 뿐만 아니라.

내가 찾는 대부분의 모든에 대한 구체적인 예의 각 시나리오,바람직하게는 누군가 그들을 사용합니다.

도움이 되었습니까?

해결책

요약의 what I've seen so far:

  • 어떤 사람들은 좋아하지 않는 계단식에서 모두.

캐스케이드 삭제

  • 캐스케이드 삭제할 수 있습 감각을 만들 때의 의미 관계를 포함할 수 있는 독점 의 일부입니다""설명합니다.예를 들어,OrderLine 기록부분의 부모는 순,그리고 OrderLines 공유되지 않을 것이 사이의 여러 주문입니다.는 경우에는 순서가 사라지고,이 OrderLine 해야 뿐만 아니라,라인 순서없이 될 것이 문제입니다.
  • 표준에 대한 예 폭포 삭제 SomeObject 및 SomeObjectItems,치지 않게 어떤 의미에 대한 항목에 레코드를 존재하지 않고 해당되는 주요한 기록합니다.
  • 사용 삭제되는 경우 당신이 기록을 보존하거나 사용하는"소프트/삭제를 논리적"당신은 어디에만 설정 삭제된 비트가 열 1/사실이다.

모두 업데이트

  • 모두 업데이트 할 수 있습을 사용할 때 실시 키 보다는 오히려 대리 키(id/자동 증가 열)에서 테이블이 있습니다.
  • 표준에 대한 예 Cascade 업데이트가 있을 때 변경 가능한 외국인 핵심,다음과 같은 사용자 이름을 변경할 수 있습니다.
  • 사용 Cascade 업데이트 키를 사용하는 Id/자동 증가 열이 있습니다.
  • 모두 업데이트가 가장 좋과 함께 사용되는 독특한 제약 조건이 있습니다.

을 사용하는 경우 계단식

  • 할 수 있습을 추가한 뒤에서 사용자를 허용하기 전에이 작업을 캐스케이드,하지만 응용 프로그램에 따라 다릅니다.
  • 계단식으로 당신을 얻을 수 있는 경우 문제를 설정하는 외국 열쇠를 잘못입니다.하지만 당신은 좋아야 한 경우 그 권리가 있습니다.
  • 그것은 사용하는 것이 현명하는 연계 이해하기 전에 철저하게 그것.그러나,그것은 유용한 기능에 따라서 시간을내어 가치가있을 이해합니다.

다른 팁

외국의 열쇠를 가장 좋은 방법은 참조 무결성을 보장하기 위해 데이터베이스.을 피하는 계곡으로 마법처럼 쓰기에 모든 것 때문에 어셈블리 신뢰할 수 없는 마술 뒤에 컴파일러입니다.

무엇이 잘못 사용 외국의와 같은 키를 만들이 그들을 뒤로,예를 들어.

후안 마누엘의 예는 정규를 들어,코드를 사용할 경우 많은 기회를 떠나 가 DocumentItems 는 데이터베이스에 올 것을 물지 않습니다.

연속적인 업데이트한 유용한 경우는,예를 들어,당신은 참조 데이터에 의해 무언가는,변경할 수 있습 말하는 기본 키로 사용자의 테이블은 이름,성 조합이다.다음 당신이 원하는 변화에는 조합을 전파하는 그들이 어디에 있든지 참조됩니다.

@단,는 명확성을 참조하여 높은 온 비용,의 기회를 떠나 가 데이터베이스의 데이터는 지 않은 작.나를 위해,그것은 보통의 부족과 친숙 DB 과를 찾을 수가 없는 FKs 는 장소에서 작업을 하기 전에 DB 를 육성하는 두려움입니다.거나,또는 일정한 캐스케이드의 오용,그것을 사용하는 엔티티가지 개념적으로 관련,또는 당신을 보존하는 역사입니다.

나는 사용하지 않 연속 삭제합니다.

면 내가 뭔가를 원하는 데이터베이스에서 제거되 내가 원하는 명시적으로 말한 데이터베이스 내가 무엇을 원하셨다.

물론 그들은 함수에서 사용할 수 있는 데이터베이스 시간이 있을 수 있습니다면 그것은 좋아요,그것들을 사용하는 경우 예를 들어 있는'주문'테이블과'orderItem'테이블을 선택 취소할 수 있습을 때 당신을 삭제합니다.

나는 다음과 같은 명확성에서 얻을하는 코드(또는 저장 프로시저)보다는 오히려'마술'일어나고 있다.

같은 이유로 나가지의 트리거를 중 하나.

무언가를 주는 삭제하지 않은 경우에는'주문'당신을 얻을 것이'1 행 영향을'다시 보고하는 경우에도 계단식 삭제는 제거 50'orderItem 습니다.

내가 많은 일을 계단식으로 삭제합니다.

그것은 좋은 느낌을 알고 누구든 작품에 대한 데이터베이스에 수도를 떠나지 않을 원하지 않는 데이터입니다.는 경우 종속성을 성장 내가 그냥 제약 조건을 변경하에서 diagramm 관리 및 스튜디오가 있을 조정할 sp 또는 dataacces.

는 말했다,나는 1 에 문제가 계단식으로 삭제하고 이잖아 순환을 참조.이 종종 부품의 데이터베이스가 없는 연속 삭제합니다.

나는 많은 데이터베이스의 작동이 거의 캐스케이드을 찾을 삭제하는 유용합니다.하나간 나는 그들을 사용 효과적으로는 보고 있는 데이터베이스에 의해 업데이트 야간 작업입니다.내가 있는지 확인하십시오 변경된 데이터가 제대로 가져온를 삭제하여 최고 수준의 기록이 변경된 후에 가져오고,그 다음 다시 가져올 수정된 기록과는 아무것도에 관한 것이다.그것을 저장하는 데에서 저를 많이 쓰는 복잡한 삭제하는 모양 아래에서 최고의 데이터베이스입니다.

나는 고려하지 않는 모두 삭제합을 아주 나쁜 트리거로 그들은 단지 삭제 데이터 트리거 모든 종류를 할 수 있습니다 불쾌한 내부 물건입니다.

에서 일반적인 내가 피해 실시 삭제를 완전히 논리적 사용을 삭제(ie.는 데 조금이라는 열 삭제되는 true)다.

한 가지 예가 있을 때 간의 종속성을 entities...ie:문서>DocumentItems(를 삭제할 때 문서,DocumentItems 하지 않는 이유가 있는 존재)

사용 캐스케이드 삭제 어디서 당신이 원하는 것이 기록 FK 제거할 경우를 참조 PK 레코드 제거되었습니다.즉,레코드가 의미가 없이 참조하는 기록이다.

내가 찾는 폭포 삭제한 유용한지 확인하는 죽은 참조은 기본적으로 제거되기보다는 원인 null 예외가 있습니다.

에서 삭제 Cascade:

행에 아동 테이블을 삭제할 는 경우 해당하는 행 삭제 에서 부모 테이블.

는 경우 에 캐스케이드 삭제 사용되지 않음 오류가 발생한 참조 무결성.

에 업데이트 Cascade:

에서 변경은 기본 열쇠 에서 업데이트할 외국 열쇠

이유 중 하나에 넣을 모두 삭제(을 하기 보다는 오히려 그것은 코드)는 성능을 향상시킬 수 있습니다.

Case1:캐스케이드 삭제

 DELETE FROM table WHERE SomeDate < 7 years ago;

사례 2:지 않고 폭포 삭제

 FOR EACH R IN (SELECT FROM table WHERE SomeDate < 7 years ago) LOOP
   DELETE FROM ChildTable WHERE tableId = R.tableId;
   DELETE FROM table WHERE tableId = R.tableid;
   /* More child tables here */
 NEXT

둘째,추가할 경우에는 추가 아이를 테이블로 캐스케이드 삭제 코드는 경우에는 1 유지 작동합니다.

나는 것만에 넣어 cascade 는 의미의 관계입니다"부".그렇지 않으면 몇 가지 바보같이 삭제 절반의 데이터베이스를 수행할 때:

DELETE FROM CURRENCY WHERE CurrencyCode = 'USD'

내가 들어 있 Dba 및/또는"회사 정책은"금지"를 사용하여 삭제 Cascade"(및 다른 사람)순수하기 때문에 나쁜 경험을니다.하나의 경우에는 사람이 쓴 세이 트리거되는 종료를 호출합니다.세 가지 일을 복구하는 결과가 총 금지 트리거 모든기 때문에 작업의 하나 idjit.

의 과정을 때로는 트리거는 필요하"대신에서 삭제를 캐스케이드"때와 같은 일부 아동에 필요한 데이터 보존됩니다.하지만 다른 경우에는,그것의 완벽한 유효한 사용에서 삭제를 캐스케이드 방법입니다.의 핵심적인 장점은"삭제를 캐스케이드"캡처하는 모든 아이들은;사용자 지정 작성된 트리거/저장 프로시저지 않을 수도 있지 않은 경우 코딩습니다.

내가 믿는 개발자가 허용되어야 한 결정을 내려한 성능을 기준으로 개발 및 특 말한다.카펫을 금지에 따라 나쁜 경험하지 않아야 합 조건는"사용"생각하는 과정은 엄격한에서 최고입니다.는 심판을 각각을 만들 수 있는 시간,그리고 변경 내용으로는 비즈니스 모델을 변경합니다.

이 무엇을 하지 않습니다발 모두에 대해인가?

을 삭제하거나 업데이트 하지 않았다는 명시적으로 요청에서 SQL server.

중 하나를 통해 연계 또는의 사용을 통해 트리거합니다.그들은 당신을 물에서 아래 약간의 시간을 줄 하나,경고를 추적하는 버그 또는 진단할 때 성능 문제입니다.

내가 사용하는 것이 그들에 일관성을 보장하는지에 대한 매우 많은 노력을 기울입니다.동일한 효과를 얻으려면 당신은 것을 사용하여 저장합니다.

내가 다른 사람들처럼,여기에는 폭포 삭제합니다 정말로 소폭 도움이 됩니다(정말 많은 작업을 삭제하는 참조 데이터--기타 테이블이 있는 경우에는 테이블을 많이,당신은 단순히 자동화하는 이 스크립트로)그러나 정말 사람이 실수로 캐스케이드는 몇 가지 중요한 데이터를 삭제하기 어려운 복원 할 수 있습니다.

경우에만 나는 사용하는 경우에 데이터를 테이블 테이블의 높은 제어(예:제한되는 사용 권한)만 업데이트하거나 삭제를 통해 제어된 프로세스(예:소프트웨어 업데이트)에서는 확인되었습니다.

삭제하거나 업데이트를 제거 하는 외국인 키 값을 발견하의 튜플 R 처리할 수 있는 세 가지 방법 중 하나:

  1. 거절
  2. 전파
  3. 폐.

전파 라고 cascading.

다음과 같은 두 가지 경우가 있습니다:

‣경우 튜플에 들이 삭제 되었,삭제를 R 튜플라고 합니다.

‣경우 튜플에 들었 업데이트,업데이트 값에 R 튜플는 그것을 참조하십시오.

만약 당신이 시스템에서 일하고 많은 다른 모듈을 다른 버전에서,그것은 매우 도움이 될 수 있는 경우,캐스케이드 항목을 삭제 부분의/에 의해 소유 PK 홀더입니다.다른 모든 모듈이 필요한 것이 즉각적인 패치를 깨끗한 자신의 의존 항목을 삭제하기 전에 PK 소유자,또는 외국인 핵심 관계를 생략 될 것이 완전히 가능성을 떠나 톤의 쓰레기 시스템에서 정리하는 경우 제대로 수행되지 않습니다.

나는 단지 도입된 폭포 삭제에 대해 교차로에 새로운 테이블을 사이에 두 개의 기존의 테이블(교차로를 삭제하는 것),캐스케이드 후 삭제되었다는 낙담해서 꽤 많은 시간입니다.그것은 또한 너무 나쁘지 않다면 데이터 손실됩니다.

그것은,그러나,나쁜 일에 열거 같은 목록은 테이블:누군가가 항목을 삭제 13-에서 노란색이 표는"색상",그리고 모든 항목을 데이터베이스에서 삭제됩니다.또한,이때 업데이트에서 삭제-모든 삽입하는 모든 방식으로도 참조 무결성을 완전히 생략됩니다.물론 그것은 잘못이지만,당신은 어떻게 변화 복합 소프트웨어 실행 되는 몇 년 동안,도입으로의 진정한 참조 무결성 위험에 있는 예기치 못한 측면을 효과를 볼 수 있습니까?

또 다른 문제입니다면 원래 외국인 키 값을 보관하여야 한 후에도 기본 키가 삭제되었습니다.중 하나 만들 수 있는 묘비 란과에서 설정 삭제 NULL 에 대한 옵션을 원 FK 지만,이것은 다시 트리거를 요구 또는 특정 코드를 유지하는 중복(제외한 후 PK 삭제)키 값입니다.

캐스케이드 삭제 내용을 때 매우 유용을 구현하는 최고 논리적 형식과 하위 유형은 엔터티에는 실제 데이터베이스입니다.

의 경우 별도 타고 서브 유형 테이블을 사용하여 육체적으로 구현하는 슈퍼형/sub-형(반대로 회전의 모든 하위 유형 특성을 단일 육체적인 유형의 테이블)가,one-to-one 사이의 관계를 이러한 테이블이 문제가 됩을 유지하는 방법에는 기본 키가에서 100%사이에 동기화하고 이러한 테이블이 있습니다.

캐스케이드 삭제할 수 있습기 위해 매우 유용한 도구가:

1)있는지 확인을 삭제하는 슈퍼형 레코드는 삭제도 해당 하나의 서브 유형 기록합니다.

2)는지 확인하십시오 삭제를 하위 유형 기록을 삭제 유형의 기록이다.이에 의해 달성을 구현하는 대신에"-"삭제거에 sub-type 테이블가 및 삭제를 해당 유형의 기록은,차례차례로,폭포 삭제 sub-type 기록합니다.

를 사용하여 캐스케이드에서 삭제를 방식으로 이렇게 하지 않아 슈퍼형 또는 하위 유형 기록이 존재하는지 여부에 관계없이 삭제할 수퍼형 레코드 또는 하위 유형 기록 처음이다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top