From cf2cd1523ed1912a103000f8374f4f876886e27d Mon Sep 17 00:00:00 2001 From: Gogulnath Rajarajeswaran Date: Wed, 28 Jan 2026 19:02:33 +0530 Subject: [PATCH 1/4] S-128192 purge script for Release asset --- purge-project/PurgeProject-25.1.sql | 39 ++++++++++++++++++++++++++--- purge-project/PurgeProject-25.2.sql | 39 ++++++++++++++++++++++++++--- purge-project/PurgeProject-25.3.sql | 39 ++++++++++++++++++++++++++--- purge-project/PurgeProject-26.0.sql | 39 ++++++++++++++++++++++++++--- 4 files changed, 140 insertions(+), 16 deletions(-) diff --git a/purge-project/PurgeProject-25.1.sql b/purge-project/PurgeProject-25.1.sql index dc7af34..ee34a3d 100644 --- a/purge-project/PurgeProject-25.1.sql +++ b/purge-project/PurgeProject-25.1.sql @@ -496,6 +496,30 @@ select ID from Timesheet_Now join @doomed on doomed=MemberID insert @doomed select ID from SavedView_Now join @doomed on doomed=OwnerID or doomed=ScopeID +-- doom Releases of doomed Epics and PrimaryWorkitems +-- except current/past Releases of safe Epics and PrimaryWorkitems +insert @doomed +select distinct PlannedReleaseID from Epic_Now join @doomed on doomed=ID where PlannedReleaseID is not null +union +select distinct ReleaseID from PrimaryWorkitem_Now join @doomed on doomed=ID where ReleaseID is not null +except +(select distinct PlannedReleaseID from Epic where ID not in (select doomed from @doomed) and PlannedReleaseID is not null +union +select distinct ReleaseID from PrimaryWorkitem where ID not in (select doomed from @doomed) and ReleaseID is not null) + +-- doom ValueStreams of doomed Releases +-- except ValueStreams of safe Releases +insert @doomed +select distinct ValueStreamID from Release_Now join @doomed on doomed=ID where ValueStreamID is not null +except +select distinct ValueStreamID from Release_Now where ID not in (select doomed from @doomed) and ValueStreamID is not null + +-- Releases of safe ValuesStreams are safe +delete @doomed +from Release_Now join @doomed on doomed=ID +where ValueStreamID is not null +and ValueStreamID not in (select doomed from @doomed) + ------------------------------------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------------------------------ @@ -1179,6 +1203,8 @@ update PrimaryWorkitem_Now set ClassOfServiceID=null from @doomed where doomed=C select @error=@@ERROR; if @error<>0 goto ERR update PrimaryWorkitem_Now set DeliveryCategoryID=null from @doomed where doomed=DeliveryCategoryID select @error=@@ERROR; if @error<>0 goto ERR +update PrimaryWorkitem_Now set ReleaseID=null from @doomed where doomed=ReleaseID +select @error=@@ERROR; if @error<>0 goto ERR delete PrimaryWorkitem from @doomed where doomed=ID select @error=@@ERROR; if @error<>0 goto ERR update PrimaryWorkitem set StatusID=null from @doomed where doomed=StatusID @@ -1191,6 +1217,8 @@ update PrimaryWorkitem set ClassOfServiceID=null from @doomed where doomed=Class select @error=@@ERROR; if @error<>0 goto ERR update PrimaryWorkitem set DeliveryCategoryID=null from @doomed where doomed=DeliveryCategoryID select @error=@@ERROR; if @error<>0 goto ERR +update PrimaryWorkitem set ReleaseID=null from @doomed where doomed=ReleaseID +select @error=@@ERROR; if @error<>0 goto ERR raiserror('%s PrimaryWorkitems purged', 0, 1, @rowcount) with nowait raiserror('Themes', 0, 1) with nowait @@ -1239,8 +1267,6 @@ update Workitem_Now set TeamID=null from @doomed where doomed=TeamID select @error=@@ERROR; if @error<>0 goto ERR update Workitem_Now set TimeboxID=null from @doomed where doomed=TimeboxID select @error=@@ERROR; if @error<>0 goto ERR -update Workitem_Now set ReleaseID=null from @doomed where doomed=ReleaseID -select @error=@@ERROR; if @error<>0 goto ERR delete Workitem from @doomed where doomed=ID select @error=@@ERROR; if @error<>0 goto ERR update Workitem set ParentID=null from @doomed where doomed=ParentID @@ -1251,10 +1277,15 @@ update Workitem set TeamID=null from @doomed where doomed=TeamID select @error=@@ERROR; if @error<>0 goto ERR update Workitem set TimeboxID=null from @doomed where doomed=TimeboxID select @error=@@ERROR; if @error<>0 goto ERR -update Workitem set ReleaseID=null from @doomed where doomed=ReleaseID -select @error=@@ERROR; if @error<>0 goto ERR raiserror('%s Workitems purged', 0, 1, @rowcount) with nowait +raiserror('Releases', 0, 1) with nowait +delete Release_Now from @doomed where doomed=ID +select @rowcount=@@ROWCOUNT, @error=@@ERROR; if @error<>0 goto ERR +delete Release from @doomed where doomed=ID +select @error=@@ERROR; if @error<>0 goto ERR +raiserror('%s Releases purged', 0, 1, @rowcount) with nowait + raiserror('Timeboxes', 0, 1) with nowait delete Timebox_Now from @doomed where doomed=ID select @rowcount=@@ROWCOUNT, @error=@@ERROR; if @error<>0 goto ERR diff --git a/purge-project/PurgeProject-25.2.sql b/purge-project/PurgeProject-25.2.sql index ea94014..cd642fb 100644 --- a/purge-project/PurgeProject-25.2.sql +++ b/purge-project/PurgeProject-25.2.sql @@ -496,6 +496,30 @@ select ID from Timesheet_Now join @doomed on doomed=MemberID insert @doomed select ID from SavedView_Now join @doomed on doomed=OwnerID or doomed=ScopeID +-- doom Releases of doomed Epics and PrimaryWorkitems +-- except current/past Releases of safe Epics and PrimaryWorkitems +insert @doomed +select distinct PlannedReleaseID from Epic_Now join @doomed on doomed=ID where PlannedReleaseID is not null +union +select distinct ReleaseID from PrimaryWorkitem_Now join @doomed on doomed=ID where ReleaseID is not null +except +(select distinct PlannedReleaseID from Epic where ID not in (select doomed from @doomed) and PlannedReleaseID is not null +union +select distinct ReleaseID from PrimaryWorkitem where ID not in (select doomed from @doomed) and ReleaseID is not null) + +-- doom ValueStreams of doomed Releases +-- except ValueStreams of safe Releases +insert @doomed +select distinct ValueStreamID from Release_Now join @doomed on doomed=ID where ValueStreamID is not null +except +select distinct ValueStreamID from Release_Now where ID not in (select doomed from @doomed) and ValueStreamID is not null + +-- Releases of safe ValuesStreams are safe +delete @doomed +from Release_Now join @doomed on doomed=ID +where ValueStreamID is not null +and ValueStreamID not in (select doomed from @doomed) + ------------------------------------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------------------------------ @@ -1179,6 +1203,8 @@ update PrimaryWorkitem_Now set ClassOfServiceID=null from @doomed where doomed=C select @error=@@ERROR; if @error<>0 goto ERR update PrimaryWorkitem_Now set DeliveryCategoryID=null from @doomed where doomed=DeliveryCategoryID select @error=@@ERROR; if @error<>0 goto ERR +update PrimaryWorkitem_Now set ReleaseID=null from @doomed where doomed=ReleaseID +select @error=@@ERROR; if @error<>0 goto ERR delete PrimaryWorkitem from @doomed where doomed=ID select @error=@@ERROR; if @error<>0 goto ERR update PrimaryWorkitem set StatusID=null from @doomed where doomed=StatusID @@ -1191,6 +1217,8 @@ update PrimaryWorkitem set ClassOfServiceID=null from @doomed where doomed=Class select @error=@@ERROR; if @error<>0 goto ERR update PrimaryWorkitem set DeliveryCategoryID=null from @doomed where doomed=DeliveryCategoryID select @error=@@ERROR; if @error<>0 goto ERR +update PrimaryWorkitem set ReleaseID=null from @doomed where doomed=ReleaseID +select @error=@@ERROR; if @error<>0 goto ERR raiserror('%s PrimaryWorkitems purged', 0, 1, @rowcount) with nowait raiserror('Themes', 0, 1) with nowait @@ -1239,8 +1267,6 @@ update Workitem_Now set TeamID=null from @doomed where doomed=TeamID select @error=@@ERROR; if @error<>0 goto ERR update Workitem_Now set TimeboxID=null from @doomed where doomed=TimeboxID select @error=@@ERROR; if @error<>0 goto ERR -update Workitem_Now set ReleaseID=null from @doomed where doomed=ReleaseID -select @error=@@ERROR; if @error<>0 goto ERR delete Workitem from @doomed where doomed=ID select @error=@@ERROR; if @error<>0 goto ERR update Workitem set ParentID=null from @doomed where doomed=ParentID @@ -1251,10 +1277,15 @@ update Workitem set TeamID=null from @doomed where doomed=TeamID select @error=@@ERROR; if @error<>0 goto ERR update Workitem set TimeboxID=null from @doomed where doomed=TimeboxID select @error=@@ERROR; if @error<>0 goto ERR -update Workitem set ReleaseID=null from @doomed where doomed=ReleaseID -select @error=@@ERROR; if @error<>0 goto ERR raiserror('%s Workitems purged', 0, 1, @rowcount) with nowait +raiserror('Releases', 0, 1) with nowait +delete Release_Now from @doomed where doomed=ID +select @rowcount=@@ROWCOUNT, @error=@@ERROR; if @error<>0 goto ERR +delete Release from @doomed where doomed=ID +select @error=@@ERROR; if @error<>0 goto ERR +raiserror('%s Releases purged', 0, 1, @rowcount) with nowait + raiserror('Timeboxes', 0, 1) with nowait delete Timebox_Now from @doomed where doomed=ID select @rowcount=@@ROWCOUNT, @error=@@ERROR; if @error<>0 goto ERR diff --git a/purge-project/PurgeProject-25.3.sql b/purge-project/PurgeProject-25.3.sql index bdfe3ba..d8cfe20 100644 --- a/purge-project/PurgeProject-25.3.sql +++ b/purge-project/PurgeProject-25.3.sql @@ -496,6 +496,30 @@ select ID from Timesheet_Now join @doomed on doomed=MemberID insert @doomed select ID from SavedView_Now join @doomed on doomed=OwnerID or doomed=ScopeID +-- doom Releases of doomed Epics and PrimaryWorkitems +-- except current/past Releases of safe Epics and PrimaryWorkitems +insert @doomed +select distinct PlannedReleaseID from Epic_Now join @doomed on doomed=ID where PlannedReleaseID is not null +union +select distinct ReleaseID from PrimaryWorkitem_Now join @doomed on doomed=ID where ReleaseID is not null +except +(select distinct PlannedReleaseID from Epic where ID not in (select doomed from @doomed) and PlannedReleaseID is not null +union +select distinct ReleaseID from PrimaryWorkitem where ID not in (select doomed from @doomed) and ReleaseID is not null) + +-- doom ValueStreams of doomed Releases +-- except ValueStreams of safe Releases +insert @doomed +select distinct ValueStreamID from Release_Now join @doomed on doomed=ID where ValueStreamID is not null +except +select distinct ValueStreamID from Release_Now where ID not in (select doomed from @doomed) and ValueStreamID is not null + +-- Releases of safe ValuesStreams are safe +delete @doomed +from Release_Now join @doomed on doomed=ID +where ValueStreamID is not null +and ValueStreamID not in (select doomed from @doomed) + ------------------------------------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------------------------------ @@ -1183,6 +1207,8 @@ update PrimaryWorkitem_Now set ClassOfServiceID=null from @doomed where doomed=C select @error=@@ERROR; if @error<>0 goto ERR update PrimaryWorkitem_Now set DeliveryCategoryID=null from @doomed where doomed=DeliveryCategoryID select @error=@@ERROR; if @error<>0 goto ERR +update PrimaryWorkitem_Now set ReleaseID=null from @doomed where doomed=ReleaseID +select @error=@@ERROR; if @error<>0 goto ERR delete PrimaryWorkitem from @doomed where doomed=ID select @error=@@ERROR; if @error<>0 goto ERR update PrimaryWorkitem set StatusID=null from @doomed where doomed=StatusID @@ -1195,6 +1221,8 @@ update PrimaryWorkitem set ClassOfServiceID=null from @doomed where doomed=Class select @error=@@ERROR; if @error<>0 goto ERR update PrimaryWorkitem set DeliveryCategoryID=null from @doomed where doomed=DeliveryCategoryID select @error=@@ERROR; if @error<>0 goto ERR +update PrimaryWorkitem set ReleaseID=null from @doomed where doomed=ReleaseID +select @error=@@ERROR; if @error<>0 goto ERR raiserror('%s PrimaryWorkitems purged', 0, 1, @rowcount) with nowait raiserror('Themes', 0, 1) with nowait @@ -1243,8 +1271,6 @@ update Workitem_Now set TeamID=null from @doomed where doomed=TeamID select @error=@@ERROR; if @error<>0 goto ERR update Workitem_Now set TimeboxID=null from @doomed where doomed=TimeboxID select @error=@@ERROR; if @error<>0 goto ERR -update Workitem_Now set ReleaseID=null from @doomed where doomed=ReleaseID -select @error=@@ERROR; if @error<>0 goto ERR delete Workitem from @doomed where doomed=ID select @error=@@ERROR; if @error<>0 goto ERR update Workitem set ParentID=null from @doomed where doomed=ParentID @@ -1255,10 +1281,15 @@ update Workitem set TeamID=null from @doomed where doomed=TeamID select @error=@@ERROR; if @error<>0 goto ERR update Workitem set TimeboxID=null from @doomed where doomed=TimeboxID select @error=@@ERROR; if @error<>0 goto ERR -update Workitem set ReleaseID=null from @doomed where doomed=ReleaseID -select @error=@@ERROR; if @error<>0 goto ERR raiserror('%s Workitems purged', 0, 1, @rowcount) with nowait +raiserror('Releases', 0, 1) with nowait +delete Release_Now from @doomed where doomed=ID +select @rowcount=@@ROWCOUNT, @error=@@ERROR; if @error<>0 goto ERR +delete Release from @doomed where doomed=ID +select @error=@@ERROR; if @error<>0 goto ERR +raiserror('%s Releases purged', 0, 1, @rowcount) with nowait + raiserror('Timeboxes', 0, 1) with nowait delete Timebox_Now from @doomed where doomed=ID select @rowcount=@@ROWCOUNT, @error=@@ERROR; if @error<>0 goto ERR diff --git a/purge-project/PurgeProject-26.0.sql b/purge-project/PurgeProject-26.0.sql index 4fd4aec..4fa8db2 100644 --- a/purge-project/PurgeProject-26.0.sql +++ b/purge-project/PurgeProject-26.0.sql @@ -496,6 +496,30 @@ select ID from Timesheet_Now join @doomed on doomed=MemberID insert @doomed select ID from SavedView_Now join @doomed on doomed=OwnerID or doomed=ScopeID +-- doom Releases of doomed Epics and PrimaryWorkitems +-- except current/past Releases of safe Epics and PrimaryWorkitems +insert @doomed +select distinct PlannedReleaseID from Epic_Now join @doomed on doomed=ID where PlannedReleaseID is not null +union +select distinct ReleaseID from PrimaryWorkitem_Now join @doomed on doomed=ID where ReleaseID is not null +except +(select distinct PlannedReleaseID from Epic where ID not in (select doomed from @doomed) and PlannedReleaseID is not null +union +select distinct ReleaseID from PrimaryWorkitem where ID not in (select doomed from @doomed) and ReleaseID is not null) + +-- doom ValueStreams of doomed Releases +-- except ValueStreams of safe Releases +insert @doomed +select distinct ValueStreamID from Release_Now join @doomed on doomed=ID where ValueStreamID is not null +except +select distinct ValueStreamID from Release_Now where ID not in (select doomed from @doomed) and ValueStreamID is not null + +-- Releases of safe ValuesStreams are safe +delete @doomed +from Release_Now join @doomed on doomed=ID +where ValueStreamID is not null +and ValueStreamID not in (select doomed from @doomed) + ------------------------------------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------------------------------ @@ -1183,6 +1207,8 @@ update PrimaryWorkitem_Now set ClassOfServiceID=null from @doomed where doomed=C select @error=@@ERROR; if @error<>0 goto ERR update PrimaryWorkitem_Now set DeliveryCategoryID=null from @doomed where doomed=DeliveryCategoryID select @error=@@ERROR; if @error<>0 goto ERR +update PrimaryWorkitem_Now set ReleaseID=null from @doomed where doomed=ReleaseID +select @error=@@ERROR; if @error<>0 goto ERR delete PrimaryWorkitem from @doomed where doomed=ID select @error=@@ERROR; if @error<>0 goto ERR update PrimaryWorkitem set StatusID=null from @doomed where doomed=StatusID @@ -1195,6 +1221,8 @@ update PrimaryWorkitem set ClassOfServiceID=null from @doomed where doomed=Class select @error=@@ERROR; if @error<>0 goto ERR update PrimaryWorkitem set DeliveryCategoryID=null from @doomed where doomed=DeliveryCategoryID select @error=@@ERROR; if @error<>0 goto ERR +update PrimaryWorkitem set ReleaseID=null from @doomed where doomed=ReleaseID +select @error=@@ERROR; if @error<>0 goto ERR raiserror('%s PrimaryWorkitems purged', 0, 1, @rowcount) with nowait raiserror('Themes', 0, 1) with nowait @@ -1243,8 +1271,6 @@ update Workitem_Now set TeamID=null from @doomed where doomed=TeamID select @error=@@ERROR; if @error<>0 goto ERR update Workitem_Now set TimeboxID=null from @doomed where doomed=TimeboxID select @error=@@ERROR; if @error<>0 goto ERR -update Workitem_Now set ReleaseID=null from @doomed where doomed=ReleaseID -select @error=@@ERROR; if @error<>0 goto ERR delete Workitem from @doomed where doomed=ID select @error=@@ERROR; if @error<>0 goto ERR update Workitem set ParentID=null from @doomed where doomed=ParentID @@ -1255,10 +1281,15 @@ update Workitem set TeamID=null from @doomed where doomed=TeamID select @error=@@ERROR; if @error<>0 goto ERR update Workitem set TimeboxID=null from @doomed where doomed=TimeboxID select @error=@@ERROR; if @error<>0 goto ERR -update Workitem set ReleaseID=null from @doomed where doomed=ReleaseID -select @error=@@ERROR; if @error<>0 goto ERR raiserror('%s Workitems purged', 0, 1, @rowcount) with nowait +raiserror('Releases', 0, 1) with nowait +delete Release_Now from @doomed where doomed=ID +select @rowcount=@@ROWCOUNT, @error=@@ERROR; if @error<>0 goto ERR +delete Release from @doomed where doomed=ID +select @error=@@ERROR; if @error<>0 goto ERR +raiserror('%s Releases purged', 0, 1, @rowcount) with nowait + raiserror('Timeboxes', 0, 1) with nowait delete Timebox_Now from @doomed where doomed=ID select @rowcount=@@ROWCOUNT, @error=@@ERROR; if @error<>0 goto ERR From f94035778de11a28ad3d0532ff5ca4bd4cf5045b Mon Sep 17 00:00:00 2001 From: Gogulnath Rajarajeswaran Date: Wed, 28 Jan 2026 20:29:20 +0530 Subject: [PATCH 2/4] S-128192 address review comments - Moved dooming Release before dooming BaseAssets. - Removed distinct as union already handles it. - Removed `is not null` from the exclusion. - Removed `is not null` condition for ValueStreamID as it cannot be null. --- purge-project/PurgeProject-25.1.sql | 47 ++++++++++++++--------------- purge-project/PurgeProject-25.2.sql | 47 ++++++++++++++--------------- purge-project/PurgeProject-25.3.sql | 47 ++++++++++++++--------------- purge-project/PurgeProject-26.0.sql | 47 ++++++++++++++--------------- 4 files changed, 92 insertions(+), 96 deletions(-) diff --git a/purge-project/PurgeProject-25.1.sql b/purge-project/PurgeProject-25.1.sql index ee34a3d..59e074c 100644 --- a/purge-project/PurgeProject-25.1.sql +++ b/purge-project/PurgeProject-25.1.sql @@ -397,6 +397,29 @@ select ID from StrategicTheme_Now join @doomed on doomed=ScopeID insert @doomed select ID from Milestone_Now join @doomed on doomed=ScopeID +-- doom Releases of doomed Epics and PrimaryWorkitems +-- except current/past Releases of safe Epics and PrimaryWorkitems +insert @doomed +select PlannedReleaseID from Epic_Now join @doomed on doomed=ID where PlannedReleaseID is not null +union +select ReleaseID from PrimaryWorkitem_Now join @doomed on doomed=ID where ReleaseID is not null +except +(select PlannedReleaseID from Epic where ID not in (select doomed from @doomed) +union +select ReleaseID from PrimaryWorkitem where ID not in (select doomed from @doomed)) + +-- doom ValueStreams of doomed Releases +-- except ValueStreams of safe Releases +insert @doomed +select distinct ValueStreamID from Release_Now join @doomed on doomed=ID +except +select distinct ValueStreamID from Release_Now where ID not in (select doomed from @doomed) + +-- Releases of safe ValuesStreams are safe +delete @doomed +from Release_Now join @doomed on doomed=ID +where ValueStreamID not in (select doomed from @doomed) + -- doom BaseAssets that are secured by doomed Scopes -- NOTE: This should always be done after all other BaseAsset types, in case other secured items are added by more specific inserts -- BUT before any non-BaseAsset that is doomed by a relation to BaseAsset @@ -496,30 +519,6 @@ select ID from Timesheet_Now join @doomed on doomed=MemberID insert @doomed select ID from SavedView_Now join @doomed on doomed=OwnerID or doomed=ScopeID --- doom Releases of doomed Epics and PrimaryWorkitems --- except current/past Releases of safe Epics and PrimaryWorkitems -insert @doomed -select distinct PlannedReleaseID from Epic_Now join @doomed on doomed=ID where PlannedReleaseID is not null -union -select distinct ReleaseID from PrimaryWorkitem_Now join @doomed on doomed=ID where ReleaseID is not null -except -(select distinct PlannedReleaseID from Epic where ID not in (select doomed from @doomed) and PlannedReleaseID is not null -union -select distinct ReleaseID from PrimaryWorkitem where ID not in (select doomed from @doomed) and ReleaseID is not null) - --- doom ValueStreams of doomed Releases --- except ValueStreams of safe Releases -insert @doomed -select distinct ValueStreamID from Release_Now join @doomed on doomed=ID where ValueStreamID is not null -except -select distinct ValueStreamID from Release_Now where ID not in (select doomed from @doomed) and ValueStreamID is not null - --- Releases of safe ValuesStreams are safe -delete @doomed -from Release_Now join @doomed on doomed=ID -where ValueStreamID is not null -and ValueStreamID not in (select doomed from @doomed) - ------------------------------------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------------------------------ diff --git a/purge-project/PurgeProject-25.2.sql b/purge-project/PurgeProject-25.2.sql index cd642fb..cd72cde 100644 --- a/purge-project/PurgeProject-25.2.sql +++ b/purge-project/PurgeProject-25.2.sql @@ -397,6 +397,29 @@ select ID from StrategicTheme_Now join @doomed on doomed=ScopeID insert @doomed select ID from Milestone_Now join @doomed on doomed=ScopeID +-- doom Releases of doomed Epics and PrimaryWorkitems +-- except current/past Releases of safe Epics and PrimaryWorkitems +insert @doomed +select PlannedReleaseID from Epic_Now join @doomed on doomed=ID where PlannedReleaseID is not null +union +select ReleaseID from PrimaryWorkitem_Now join @doomed on doomed=ID where ReleaseID is not null +except +(select PlannedReleaseID from Epic where ID not in (select doomed from @doomed) +union +select ReleaseID from PrimaryWorkitem where ID not in (select doomed from @doomed)) + +-- doom ValueStreams of doomed Releases +-- except ValueStreams of safe Releases +insert @doomed +select distinct ValueStreamID from Release_Now join @doomed on doomed=ID +except +select distinct ValueStreamID from Release_Now where ID not in (select doomed from @doomed) + +-- Releases of safe ValuesStreams are safe +delete @doomed +from Release_Now join @doomed on doomed=ID +where ValueStreamID not in (select doomed from @doomed) + -- doom BaseAssets that are secured by doomed Scopes -- NOTE: This should always be done after all other BaseAsset types, in case other secured items are added by more specific inserts -- BUT before any non-BaseAsset that is doomed by a relation to BaseAsset @@ -496,30 +519,6 @@ select ID from Timesheet_Now join @doomed on doomed=MemberID insert @doomed select ID from SavedView_Now join @doomed on doomed=OwnerID or doomed=ScopeID --- doom Releases of doomed Epics and PrimaryWorkitems --- except current/past Releases of safe Epics and PrimaryWorkitems -insert @doomed -select distinct PlannedReleaseID from Epic_Now join @doomed on doomed=ID where PlannedReleaseID is not null -union -select distinct ReleaseID from PrimaryWorkitem_Now join @doomed on doomed=ID where ReleaseID is not null -except -(select distinct PlannedReleaseID from Epic where ID not in (select doomed from @doomed) and PlannedReleaseID is not null -union -select distinct ReleaseID from PrimaryWorkitem where ID not in (select doomed from @doomed) and ReleaseID is not null) - --- doom ValueStreams of doomed Releases --- except ValueStreams of safe Releases -insert @doomed -select distinct ValueStreamID from Release_Now join @doomed on doomed=ID where ValueStreamID is not null -except -select distinct ValueStreamID from Release_Now where ID not in (select doomed from @doomed) and ValueStreamID is not null - --- Releases of safe ValuesStreams are safe -delete @doomed -from Release_Now join @doomed on doomed=ID -where ValueStreamID is not null -and ValueStreamID not in (select doomed from @doomed) - ------------------------------------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------------------------------ diff --git a/purge-project/PurgeProject-25.3.sql b/purge-project/PurgeProject-25.3.sql index d8cfe20..883e89c 100644 --- a/purge-project/PurgeProject-25.3.sql +++ b/purge-project/PurgeProject-25.3.sql @@ -397,6 +397,29 @@ select ID from StrategicTheme_Now join @doomed on doomed=ScopeID insert @doomed select ID from Milestone_Now join @doomed on doomed=ScopeID +-- doom Releases of doomed Epics and PrimaryWorkitems +-- except current/past Releases of safe Epics and PrimaryWorkitems +insert @doomed +select PlannedReleaseID from Epic_Now join @doomed on doomed=ID where PlannedReleaseID is not null +union +select ReleaseID from PrimaryWorkitem_Now join @doomed on doomed=ID where ReleaseID is not null +except +(select PlannedReleaseID from Epic where ID not in (select doomed from @doomed) +union +select ReleaseID from PrimaryWorkitem where ID not in (select doomed from @doomed)) + +-- doom ValueStreams of doomed Releases +-- except ValueStreams of safe Releases +insert @doomed +select distinct ValueStreamID from Release_Now join @doomed on doomed=ID +except +select distinct ValueStreamID from Release_Now where ID not in (select doomed from @doomed) + +-- Releases of safe ValuesStreams are safe +delete @doomed +from Release_Now join @doomed on doomed=ID +where ValueStreamID not in (select doomed from @doomed) + -- doom BaseAssets that are secured by doomed Scopes -- NOTE: This should always be done after all other BaseAsset types, in case other secured items are added by more specific inserts -- BUT before any non-BaseAsset that is doomed by a relation to BaseAsset @@ -496,30 +519,6 @@ select ID from Timesheet_Now join @doomed on doomed=MemberID insert @doomed select ID from SavedView_Now join @doomed on doomed=OwnerID or doomed=ScopeID --- doom Releases of doomed Epics and PrimaryWorkitems --- except current/past Releases of safe Epics and PrimaryWorkitems -insert @doomed -select distinct PlannedReleaseID from Epic_Now join @doomed on doomed=ID where PlannedReleaseID is not null -union -select distinct ReleaseID from PrimaryWorkitem_Now join @doomed on doomed=ID where ReleaseID is not null -except -(select distinct PlannedReleaseID from Epic where ID not in (select doomed from @doomed) and PlannedReleaseID is not null -union -select distinct ReleaseID from PrimaryWorkitem where ID not in (select doomed from @doomed) and ReleaseID is not null) - --- doom ValueStreams of doomed Releases --- except ValueStreams of safe Releases -insert @doomed -select distinct ValueStreamID from Release_Now join @doomed on doomed=ID where ValueStreamID is not null -except -select distinct ValueStreamID from Release_Now where ID not in (select doomed from @doomed) and ValueStreamID is not null - --- Releases of safe ValuesStreams are safe -delete @doomed -from Release_Now join @doomed on doomed=ID -where ValueStreamID is not null -and ValueStreamID not in (select doomed from @doomed) - ------------------------------------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------------------------------ diff --git a/purge-project/PurgeProject-26.0.sql b/purge-project/PurgeProject-26.0.sql index 4fa8db2..d58a690 100644 --- a/purge-project/PurgeProject-26.0.sql +++ b/purge-project/PurgeProject-26.0.sql @@ -397,6 +397,29 @@ select ID from StrategicTheme_Now join @doomed on doomed=ScopeID insert @doomed select ID from Milestone_Now join @doomed on doomed=ScopeID +-- doom Releases of doomed Epics and PrimaryWorkitems +-- except current/past Releases of safe Epics and PrimaryWorkitems +insert @doomed +select PlannedReleaseID from Epic_Now join @doomed on doomed=ID where PlannedReleaseID is not null +union +select ReleaseID from PrimaryWorkitem_Now join @doomed on doomed=ID where ReleaseID is not null +except +(select PlannedReleaseID from Epic where ID not in (select doomed from @doomed) +union +select ReleaseID from PrimaryWorkitem where ID not in (select doomed from @doomed)) + +-- doom ValueStreams of doomed Releases +-- except ValueStreams of safe Releases +insert @doomed +select distinct ValueStreamID from Release_Now join @doomed on doomed=ID +except +select distinct ValueStreamID from Release_Now where ID not in (select doomed from @doomed) + +-- Releases of safe ValuesStreams are safe +delete @doomed +from Release_Now join @doomed on doomed=ID +where ValueStreamID not in (select doomed from @doomed) + -- doom BaseAssets that are secured by doomed Scopes -- NOTE: This should always be done after all other BaseAsset types, in case other secured items are added by more specific inserts -- BUT before any non-BaseAsset that is doomed by a relation to BaseAsset @@ -496,30 +519,6 @@ select ID from Timesheet_Now join @doomed on doomed=MemberID insert @doomed select ID from SavedView_Now join @doomed on doomed=OwnerID or doomed=ScopeID --- doom Releases of doomed Epics and PrimaryWorkitems --- except current/past Releases of safe Epics and PrimaryWorkitems -insert @doomed -select distinct PlannedReleaseID from Epic_Now join @doomed on doomed=ID where PlannedReleaseID is not null -union -select distinct ReleaseID from PrimaryWorkitem_Now join @doomed on doomed=ID where ReleaseID is not null -except -(select distinct PlannedReleaseID from Epic where ID not in (select doomed from @doomed) and PlannedReleaseID is not null -union -select distinct ReleaseID from PrimaryWorkitem where ID not in (select doomed from @doomed) and ReleaseID is not null) - --- doom ValueStreams of doomed Releases --- except ValueStreams of safe Releases -insert @doomed -select distinct ValueStreamID from Release_Now join @doomed on doomed=ID where ValueStreamID is not null -except -select distinct ValueStreamID from Release_Now where ID not in (select doomed from @doomed) and ValueStreamID is not null - --- Releases of safe ValuesStreams are safe -delete @doomed -from Release_Now join @doomed on doomed=ID -where ValueStreamID is not null -and ValueStreamID not in (select doomed from @doomed) - ------------------------------------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------------------------------ ------------------------------------------------------------------------------------------------------------------------------------------------------------------ From 830cff5c9463ee268d51532349ad4f35a9b756cf Mon Sep 17 00:00:00 2001 From: Gogulnath Rajarajeswaran Date: Wed, 28 Jan 2026 20:51:12 +0530 Subject: [PATCH 3/4] S-128192 simplify the `except` query --- purge-project/PurgeProject-25.1.sql | 6 +++--- purge-project/PurgeProject-25.2.sql | 6 +++--- purge-project/PurgeProject-25.3.sql | 6 +++--- purge-project/PurgeProject-26.0.sql | 6 +++--- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/purge-project/PurgeProject-25.1.sql b/purge-project/PurgeProject-25.1.sql index 59e074c..941ec0d 100644 --- a/purge-project/PurgeProject-25.1.sql +++ b/purge-project/PurgeProject-25.1.sql @@ -404,9 +404,9 @@ select PlannedReleaseID from Epic_Now join @doomed on doomed=ID where PlannedRel union select ReleaseID from PrimaryWorkitem_Now join @doomed on doomed=ID where ReleaseID is not null except -(select PlannedReleaseID from Epic where ID not in (select doomed from @doomed) -union -select ReleaseID from PrimaryWorkitem where ID not in (select doomed from @doomed)) +select PlannedReleaseID from Epic where ID not in (select doomed from @doomed) +except +select ReleaseID from PrimaryWorkitem where ID not in (select doomed from @doomed) -- doom ValueStreams of doomed Releases -- except ValueStreams of safe Releases diff --git a/purge-project/PurgeProject-25.2.sql b/purge-project/PurgeProject-25.2.sql index cd72cde..51505d9 100644 --- a/purge-project/PurgeProject-25.2.sql +++ b/purge-project/PurgeProject-25.2.sql @@ -404,9 +404,9 @@ select PlannedReleaseID from Epic_Now join @doomed on doomed=ID where PlannedRel union select ReleaseID from PrimaryWorkitem_Now join @doomed on doomed=ID where ReleaseID is not null except -(select PlannedReleaseID from Epic where ID not in (select doomed from @doomed) -union -select ReleaseID from PrimaryWorkitem where ID not in (select doomed from @doomed)) +select PlannedReleaseID from Epic where ID not in (select doomed from @doomed) +except +select ReleaseID from PrimaryWorkitem where ID not in (select doomed from @doomed) -- doom ValueStreams of doomed Releases -- except ValueStreams of safe Releases diff --git a/purge-project/PurgeProject-25.3.sql b/purge-project/PurgeProject-25.3.sql index 883e89c..e047f3b 100644 --- a/purge-project/PurgeProject-25.3.sql +++ b/purge-project/PurgeProject-25.3.sql @@ -404,9 +404,9 @@ select PlannedReleaseID from Epic_Now join @doomed on doomed=ID where PlannedRel union select ReleaseID from PrimaryWorkitem_Now join @doomed on doomed=ID where ReleaseID is not null except -(select PlannedReleaseID from Epic where ID not in (select doomed from @doomed) -union -select ReleaseID from PrimaryWorkitem where ID not in (select doomed from @doomed)) +select PlannedReleaseID from Epic where ID not in (select doomed from @doomed) +except +select ReleaseID from PrimaryWorkitem where ID not in (select doomed from @doomed) -- doom ValueStreams of doomed Releases -- except ValueStreams of safe Releases diff --git a/purge-project/PurgeProject-26.0.sql b/purge-project/PurgeProject-26.0.sql index d58a690..bbb6ff4 100644 --- a/purge-project/PurgeProject-26.0.sql +++ b/purge-project/PurgeProject-26.0.sql @@ -404,9 +404,9 @@ select PlannedReleaseID from Epic_Now join @doomed on doomed=ID where PlannedRel union select ReleaseID from PrimaryWorkitem_Now join @doomed on doomed=ID where ReleaseID is not null except -(select PlannedReleaseID from Epic where ID not in (select doomed from @doomed) -union -select ReleaseID from PrimaryWorkitem where ID not in (select doomed from @doomed)) +select PlannedReleaseID from Epic where ID not in (select doomed from @doomed) +except +select ReleaseID from PrimaryWorkitem where ID not in (select doomed from @doomed) -- doom ValueStreams of doomed Releases -- except ValueStreams of safe Releases From 3595e61fe6439cb60f824dacae4d8bfa1b64222f Mon Sep 17 00:00:00 2001 From: Gogulnath Rajarajeswaran Date: Wed, 28 Jan 2026 21:10:57 +0530 Subject: [PATCH 4/4] S-128192 committed suggestion - doom ValueStreams ever used by doomed Releases, except those ever used by safe Releases --- purge-project/PurgeProject-25.1.sql | 7 +++---- purge-project/PurgeProject-25.2.sql | 7 +++---- purge-project/PurgeProject-25.3.sql | 7 +++---- purge-project/PurgeProject-26.0.sql | 7 +++---- 4 files changed, 12 insertions(+), 16 deletions(-) diff --git a/purge-project/PurgeProject-25.1.sql b/purge-project/PurgeProject-25.1.sql index 941ec0d..cac5214 100644 --- a/purge-project/PurgeProject-25.1.sql +++ b/purge-project/PurgeProject-25.1.sql @@ -408,12 +408,11 @@ select PlannedReleaseID from Epic where ID not in (select doomed from @doomed) except select ReleaseID from PrimaryWorkitem where ID not in (select doomed from @doomed) --- doom ValueStreams of doomed Releases --- except ValueStreams of safe Releases +-- doom ValueStreams ever used by doomed Releases, except those ever used by safe Releases insert @doomed -select distinct ValueStreamID from Release_Now join @doomed on doomed=ID +select distinct ValueStreamID from Release join @doomed on doomed=ID except -select distinct ValueStreamID from Release_Now where ID not in (select doomed from @doomed) +select ValueStreamID from Release where ID not in (select doomed from @doomed) -- Releases of safe ValuesStreams are safe delete @doomed diff --git a/purge-project/PurgeProject-25.2.sql b/purge-project/PurgeProject-25.2.sql index 51505d9..3b403e1 100644 --- a/purge-project/PurgeProject-25.2.sql +++ b/purge-project/PurgeProject-25.2.sql @@ -408,12 +408,11 @@ select PlannedReleaseID from Epic where ID not in (select doomed from @doomed) except select ReleaseID from PrimaryWorkitem where ID not in (select doomed from @doomed) --- doom ValueStreams of doomed Releases --- except ValueStreams of safe Releases +-- doom ValueStreams ever used by doomed Releases, except those ever used by safe Releases insert @doomed -select distinct ValueStreamID from Release_Now join @doomed on doomed=ID +select distinct ValueStreamID from Release join @doomed on doomed=ID except -select distinct ValueStreamID from Release_Now where ID not in (select doomed from @doomed) +select ValueStreamID from Release where ID not in (select doomed from @doomed) -- Releases of safe ValuesStreams are safe delete @doomed diff --git a/purge-project/PurgeProject-25.3.sql b/purge-project/PurgeProject-25.3.sql index e047f3b..8c34b9d 100644 --- a/purge-project/PurgeProject-25.3.sql +++ b/purge-project/PurgeProject-25.3.sql @@ -408,12 +408,11 @@ select PlannedReleaseID from Epic where ID not in (select doomed from @doomed) except select ReleaseID from PrimaryWorkitem where ID not in (select doomed from @doomed) --- doom ValueStreams of doomed Releases --- except ValueStreams of safe Releases +-- doom ValueStreams ever used by doomed Releases, except those ever used by safe Releases insert @doomed -select distinct ValueStreamID from Release_Now join @doomed on doomed=ID +select distinct ValueStreamID from Release join @doomed on doomed=ID except -select distinct ValueStreamID from Release_Now where ID not in (select doomed from @doomed) +select ValueStreamID from Release where ID not in (select doomed from @doomed) -- Releases of safe ValuesStreams are safe delete @doomed diff --git a/purge-project/PurgeProject-26.0.sql b/purge-project/PurgeProject-26.0.sql index bbb6ff4..0981fb7 100644 --- a/purge-project/PurgeProject-26.0.sql +++ b/purge-project/PurgeProject-26.0.sql @@ -408,12 +408,11 @@ select PlannedReleaseID from Epic where ID not in (select doomed from @doomed) except select ReleaseID from PrimaryWorkitem where ID not in (select doomed from @doomed) --- doom ValueStreams of doomed Releases --- except ValueStreams of safe Releases +-- doom ValueStreams ever used by doomed Releases, except those ever used by safe Releases insert @doomed -select distinct ValueStreamID from Release_Now join @doomed on doomed=ID +select distinct ValueStreamID from Release join @doomed on doomed=ID except -select distinct ValueStreamID from Release_Now where ID not in (select doomed from @doomed) +select ValueStreamID from Release where ID not in (select doomed from @doomed) -- Releases of safe ValuesStreams are safe delete @doomed