0

すべてのテーブルで論理的な削除を行っています。その ID が他のテーブルで参照されている場合、行をソフト削除しないでください。また、参照された子テーブルが削除された場合、つまり Isdeleted = 1 の場合、親レコードをソフト削除できるはずです。

あなたの提案は大歓迎です。

4

1 に答える 1

1

スキーマから動的 SQL を生成する必要があります。ここですべての項目を動的 SQL にピボットする時間はありませんが、カーソル ループまたはPIVOT動的 SQL のいずれかを使用できます。

-- 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
)
于 2012-04-20T13:01:41.717 に答える