0
我在我所有的表中都在進行軟刪除。當其他表中引用該ID時,我不應該軟刪除一行。另外,當刪除引用的子表時,即Isdeleted = 1,那麼我應該能夠軟刪除父記錄。不要軟刪除表中包含外鍵的表中的一行
您的建議非常感謝。
我在我所有的表中都在進行軟刪除。當其他表中引用該ID時,我不應該軟刪除一行。另外,當刪除引用的子表時,即Isdeleted = 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
)
哪有孩子*表有一個'IsDeleted'旗? – 2012-04-20 09:38:36
IsDeleted標誌位於父表中。我想軟刪除父表記錄。如果該記錄在任何子表中被引用,那麼我不應該進行軟刪除。 – Mohamed 2012-04-20 10:10:22
'UPDATE Parent SET IsDeleted = 1 FROM父p WHERE不存在(SELECT * FROM Child WHERE ParentID = p.ID)'? – 2012-04-20 10:14:25