2013-05-23 5 views
1

주어진 다음의 표 :행의 외래 키를 삭제할 때이를 삭제하는 방법은 무엇입니까?

create table permissions(id identity); 
create table companies(id identity, 
    permission_id bigint not null, 
    foreign key(permission_id) references permissions(id) on delete cascade); 
create table departments(id identity, 
    company_id bigint not null, 
    permission_id bigint not null, 
    foreign key(company_id) references companies(id), 
    foreign key(permission_id) references permissions(id) on delete cascade); 

부서를 삭제하면, 다음과 같은 문장이 원자 적으로 실행하려는 :

  • departments 행이 삭제 부서와 관련된
  • permissions 행 행이 삭제됨
  • companies 부서 행과 관련된 행이 삭제됨
  • (10) 회사 (이전 점)과 관련된 permissions 행이 삭제됩니다

질문 : 나는 READ_COMMITTED 트랜잭션 격리 및 모든 외부 키에 ON CASCADE DELETE를 사용하는 경우

  1. 은 행은 하나의 원자로 삭제 성명서? 아니면 그들은 READ_COMMITTED anomalies에 취약한 별도 delete 문으로 실행됩니까?
  2. 회사/부서가 삭제 될 때 (가능하면 원자 적으로) 데이터베이스에서 회사/부서 사용 권한을 삭제하도록 지시하려면 어떻게합니까?
  3. SQL 표준이이 질문에 대해 아무 말도하지 않습니까? 또는 다른 데이터베이스에서 동작이 다른가요?

해명 :

  1. 회사/부서는 권한 테이블을 참조하고 다른 방법은 주위에 필요가있다. 이는 permissionsClosure Table을 형성하기 때문입니다 (예 : 사용자가 회사에 대한 권한을 가지고 있으며 회사에 부서에 대한 권한이 있으므로 사용자가 해당 부서에 대한 권한을 가지고 있기 때문). 계층 적 관계가 다른 유형 (즉, 사용자, 회사, 부서)에 걸쳐 있기 때문에 권한 테이블은 특정 유형을 가리킬 수 없습니다. 따라서 회사/부서는 허가를 참조해야하며 그 반대가 아닙니다.
  2. 부서를 삭제하고 싶다고 가정 해 봅시다. 허가를 삭제하고 Department의 허가를 삭제하는 Department/Company는 삭제되지만 나머지는 무시하게됩니다.하지만 삭제하지 않는 것이 좋습니다. 회사의 허가.
  3. H2가 주 명령문과 별도의 데이터베이스 연결에서 트리거를 실행하고 두 명령이 동일한 회사/부서 행에 쓰기 잠금을 요청하기 때문에 회사/부서가 삭제 된 후에 트리거를 사용하여 권한을 삭제할 수 없습니다. 첫 번째 연결은 내가 삭제할 행 companies을 잠급니다. 두 번째 연결 (트리거)은 회사와 연결된 permissions 행을 삭제하려고 시도하지만 회사를 잠 그려면 ON CASCADE DELETE이 필요합니다. 이것은 H2의 제한으로 인해 해결 방법이 있기 때문에 발생했습니다.참조 https://groups.google.com/d/msg/h2-database/B3xG488RBhI/DOsIMVmPBnAJ
+0

"부서가 삭제되었습니다"라는 의미를 분명히 해주십시오. 주어진 부서 ID가있는 부서 테이블의 행이 삭제되었음을 의미합니까? 이 경우 "department.permission_id is deleted"문은 전체 행이 삭제되면 의미가 없습니다. 아니면 행이 유지되어야하며 열 permission_id 만 null로 설정되어야한다는 의미입니까? –

+0

@ThomasMueller, 혼란스럽게 생각합니다. 수정 된 질문을 참조하십시오. – Gili

답변

0

그것은의 MyISAM 아마도 MS 액세스와 mysql을 제외하고 데이터베이스의 대부분의 원자이며, 일반적으로 우리가 원하는 것을 반대하기 때문에 일반적으로 당신은 트리거와 함께 원하는 것을 할 수 있지만, 그것은 이상한, I 하나의 권한이 삭제되면 해당 권한이있는 부서도 삭제됩니다.

+0

권한 테이블 뒤에있는 디자인 목표를 분명히했습니다. – Gili

관련 문제