2012-04-20 4 views
0

모든 테이블에서 소프트 삭제를 수행하고 있습니다. 그 ID가 다른 테이블에서 참조되면 행을 부드럽게 삭제해서는 안됩니다. 또한 참조 된 자식 테이블이 삭제 될 때, 즉 Isdeleted = 1이면 상위 레코드를 소프트 삭제할 수 있어야합니다.다른 테이블에 외래 키를 포함하는 테이블의 행을 부드럽게 삭제하지 마십시오.

귀하의 제안에 감사드립니다.

+0

어떻게 아이 * 테이블 * 한'IsDeleted' 깃발? –

+0

IsDeleted 플래그가 상위 테이블에 있습니다. 부모 테이블 레코드를 부드럽게 삭제하려고합니다. 레코드가 자식 테이블에서 참조되는 경우 소프트 삭제를 수행하지 않아야합니다. – Mohamed

+0

'UPDATE 부모 SET IsDeleted = 1 FROM 부모 p WHERE NOT EXISTS (SELECT * FROM Child WHERE ParentID = p.ID)'? –

답변

1

스키마에서 일부 동적 SQL을 생성해야합니다. 나는 여기에 동적 SQL에있는 모든 항목을 돌리 시간이 없어,하지만 당신은 동적 SQL의 커서 루프 또는 가능성이 PIVOT 중 하나를 사용할 수 있습니다

-- parent/child schemas, tables, columns 
select parent_schema=p.TABLE_SCHEMA 
, parent_table=p.TABLE_NAME 
, parent_pk_column=p.COLUMN_NAME 
, child_schema=c.TABLE_SCHEMA 
, child_table=c.TABLE_NAME 
, child_fk_column=c.COLUMN_NAME 
from INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE p 
inner join INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS pc 
    on pc.UNIQUE_CONSTRAINT_SCHEMA=p.CONSTRAINT_SCHEMA 
    and pc.UNIQUE_CONSTRAINT_NAME=p.CONSTRAINT_NAME 
inner join INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE c 
    on c.CONSTRAINT_SCHEMA=pc.CONSTRAINT_SCHEMA 
    and c.CONSTRAINT_NAME=pc.CONSTRAINT_NAME 
where exists(
    select 1 from INFORMATION_SCHEMA.COLUMNS 
    where COLUMN_NAME='IsDeleted' and TABLE_SCHEMA=p.TABLE_SCHEMA and TABLE_NAME=p.TABLE_NAME 
) 

-- tables/pk columns having IsDeleted column but no children 
select parent_schema=p.TABLE_SCHEMA 
, parent_table=p.TABLE_NAME 
, parent_column=p.COLUMN_NAME 
from INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE p 
where not exists(
    select 1 from INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS 
    where UNIQUE_CONSTRAINT_SCHEMA=p.CONSTRAINT_SCHEMA 
    and UNIQUE_CONSTRAINT_NAME=p.CONSTRAINT_NAME 
) 
and exists(
    select 1 from INFORMATION_SCHEMA.COLUMNS 
    where COLUMN_NAME='IsDeleted' and TABLE_SCHEMA=p.TABLE_SCHEMA and TABLE_NAME=p.TABLE_NAME 
) 
관련 문제