0
모든 테이블에서 소프트 삭제를 수행하고 있습니다. 그 ID가 다른 테이블에서 참조되면 행을 부드럽게 삭제해서는 안됩니다. 또한 참조 된 자식 테이블이 삭제 될 때, 즉 Isdeleted = 1이면 상위 레코드를 소프트 삭제할 수 있어야합니다.다른 테이블에 외래 키를 포함하는 테이블의 행을 부드럽게 삭제하지 마십시오.
귀하의 제안에 감사드립니다.
모든 테이블에서 소프트 삭제를 수행하고 있습니다. 그 ID가 다른 테이블에서 참조되면 행을 부드럽게 삭제해서는 안됩니다. 또한 참조 된 자식 테이블이 삭제 될 때, 즉 Isdeleted = 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
)
어떻게 아이 * 테이블 * 한'IsDeleted' 깃발? –
IsDeleted 플래그가 상위 테이블에 있습니다. 부모 테이블 레코드를 부드럽게 삭제하려고합니다. 레코드가 자식 테이블에서 참조되는 경우 소프트 삭제를 수행하지 않아야합니다. – Mohamed
'UPDATE 부모 SET IsDeleted = 1 FROM 부모 p WHERE NOT EXISTS (SELECT * FROM Child WHERE ParentID = p.ID)'? –