주어진 다음의 표 :행의 외래 키를 삭제할 때이를 삭제하는 방법은 무엇입니까?
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
를 사용하는 경우
- 은 행은 하나의 원자로 삭제 성명서? 아니면 그들은
READ_COMMITTED
anomalies에 취약한 별도 delete 문으로 실행됩니까? - 회사/부서가 삭제 될 때 (가능하면 원자 적으로) 데이터베이스에서 회사/부서 사용 권한을 삭제하도록 지시하려면 어떻게합니까?
- SQL 표준이이 질문에 대해 아무 말도하지 않습니까? 또는 다른 데이터베이스에서 동작이 다른가요?
해명 :
- 회사/부서는 권한 테이블을 참조하고 다른 방법은 주위에 필요가있다. 이는
permissions
이 Closure Table을 형성하기 때문입니다 (예 : 사용자가 회사에 대한 권한을 가지고 있으며 회사에 부서에 대한 권한이 있으므로 사용자가 해당 부서에 대한 권한을 가지고 있기 때문). 계층 적 관계가 다른 유형 (즉, 사용자, 회사, 부서)에 걸쳐 있기 때문에 권한 테이블은 특정 유형을 가리킬 수 없습니다. 따라서 회사/부서는 허가를 참조해야하며 그 반대가 아닙니다. - 부서를 삭제하고 싶다고 가정 해 봅시다. 허가를 삭제하고 Department의 허가를 삭제하는 Department/Company는 삭제되지만 나머지는 무시하게됩니다.하지만 삭제하지 않는 것이 좋습니다. 회사의 허가.
-
H2가 주 명령문과 별도의 데이터베이스 연결에서 트리거를 실행하고 두 명령이 동일한 회사/부서 행에 쓰기 잠금을 요청하기 때문에 회사/부서가 삭제 된 후에 트리거를 사용하여 권한을 삭제할 수 없습니다. 첫 번째 연결은 내가 삭제할 행이것은 H2의 제한으로 인해 해결 방법이 있기 때문에 발생했습니다.참조 https://groups.google.com/d/msg/h2-database/B3xG488RBhI/DOsIMVmPBnAJcompanies
을 잠급니다. 두 번째 연결 (트리거)은 회사와 연결된permissions
행을 삭제하려고 시도하지만 회사를 잠 그려면ON CASCADE DELETE
이 필요합니다.
"부서가 삭제되었습니다"라는 의미를 분명히 해주십시오. 주어진 부서 ID가있는 부서 테이블의 행이 삭제되었음을 의미합니까? 이 경우 "department.permission_id is deleted"문은 전체 행이 삭제되면 의미가 없습니다. 아니면 행이 유지되어야하며 열 permission_id 만 null로 설정되어야한다는 의미입니까? –
@ThomasMueller, 혼란스럽게 생각합니다. 수정 된 질문을 참조하십시오. – Gili