2012-04-20 6 views
0

すべてのテーブルでソフト削除を実行しています。そのIDが他のテーブルで参照されているときに、行をソフト削除するべきではありません。また、参照された子テーブルが削除されたとき、すなわち、Isdeleted = 1のとき、親レコードをソフト削除することができるはずである。他のテーブルへの外部キーを含むテーブルの行をソフト削除しない

あなたの提案は高く評価されます。

+0

子が*テーブル* 'IsDeleted'を持つことができますどのようにフラグ? –

+0

IsDeletedフラグが親テーブルにあります。私は親テーブルのレコードをソフト削除したい。レコードが子テーブルのいずれかで参照されている場合は、ソフト削除を実行しないでください。 – Mohamed

+0

'UPDATE Parent SET IsDeleted = 1 FROM Parent P where 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 
) 
関連する問題