2012-04-20 31 views
0

我在我所有的表中都在進行軟刪除。當其他表中引用該ID時,我不應該軟刪除一行。另外,當刪除引用的子表時,即Isdeleted = 1,那麼我應該能夠軟刪除父記錄。不要軟刪除表中包含外鍵的表中的一行

您的建議非常感謝。

+0

哪有孩子*表有一個'IsDeleted'旗? – 2012-04-20 09:38:36

+0

IsDeleted標誌位於父表中。我想軟刪除父表記錄。如果該記錄在任何子表中被引用,那麼我不應該進行軟刪除。 – Mohamed 2012-04-20 10:10:22

+0

'UPDATE Parent SET IsDeleted = 1 FROM父p WHERE不存在(SELECT * FROM Child WHERE ParentID = p.ID)'? – 2012-04-20 10:14:25

回答

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 
) 
相關問題