Files
SGGL_SHJ/SGGL/Database/20260916_Cleanup_HistoricalModules.sql
T

245 lines
7.4 KiB
Transact-SQL
Raw Normal View History

/*
陕化建施工管理系统历史模块清理脚本
目标库:SGGLDB_SHJ
删除范围:
1. PHTGL(项目合同/投标管理)专属表
2. ZHGL(综合管理)专属表
明确保留:
1. HTGL 人员 API 对应代码不属于本脚本处理范围
2. WBS 表
3. 焊接共用施工日志表:
ZHGL_ConstructionLog
ZHGL_ConstructionLogMachine
ZHGL_ConstructionLogPerson
ZHGL_ConstructionLogWorkEfficiency
说明:
- 数据库已由用户提前备份,本脚本不再执行备份。
- 脚本会先删除所有涉及待删表的外键,再删除待删表。
- 脚本可重复执行;已经不存在的目标表会跳过。
- 数据库中未发现独立 JDGL_* 业务表;JDGL 进度数据使用 WBS 表,因此不删除 WBS。
- PHTGL、JDGL、PZHGL 菜单及权限由已确认的 CQMS 清理脚本按菜单类型清理;本脚本只处理业务表。
- 本脚本不删除历史日志表。
*/
USE [SGGLDB_SHJ];
GO
SET NOCOUNT ON;
SET XACT_ABORT ON;
IF DB_NAME() <> N'SGGLDB_SHJ'
BEGIN
RAISERROR(N'当前数据库不是 SGGLDB_SHJ,已停止执行。', 16, 1);
RETURN;
END;
DECLARE @DropTables TABLE
(
TableName sysname NOT NULL PRIMARY KEY
);
INSERT INTO @DropTables (TableName)
VALUES
(N'PHTGL_ActionPlanFormation'),
(N'PHTGL_ActionPlanFormation_Sch1'),
(N'PHTGL_ActionPlanReview'),
(N'PHTGL_Approve'),
(N'PHTGL_Approve_TEST'),
(N'PHTGL_AttachUrl'),
(N'PHTGL_AttachUrl1'),
(N'PHTGL_AttachUrl10'),
(N'PHTGL_AttachUrl10_HumanInput'),
(N'PHTGL_AttachUrl10_MachineInput'),
(N'PHTGL_AttachUrl11'),
(N'PHTGL_AttachUrl12'),
(N'PHTGL_AttachUrl13'),
(N'PHTGL_AttachUrl14'),
(N'PHTGL_AttachUrl15_Sch1'),
(N'PHTGL_AttachUrl15_Sch2'),
(N'PHTGL_AttachUrl15_Sch3'),
(N'PHTGL_AttachUrl15_Sch4'),
(N'PHTGL_AttachUrl18'),
(N'PHTGL_AttachUrl19'),
(N'PHTGL_AttachUrl2'),
(N'PHTGL_AttachUrl20'),
(N'PHTGL_AttachUrl2Detail'),
(N'PHTGL_AttachUrl3'),
(N'PHTGL_AttachUrl4'),
(N'PHTGL_AttachUrl5'),
(N'PHTGL_AttachUrl5_DevicePrice'),
(N'PHTGL_AttachUrl5_MaterialsPrice'),
(N'PHTGL_AttachUrl6'),
(N'PHTGL_AttachUrl7'),
(N'PHTGL_AttachUrl8'),
(N'PHTGL_AttachUrl9_SubPerson'),
(N'PHTGL_AttachUrl9_SubStaffing'),
(N'PHTGL_BidApproveUserReview'),
(N'PHTGL_BidApproveUserReview_Sch1'),
(N'PHTGL_BidDocumentsReview'),
(N'PHTGL_BidDocumentsStandingBook'),
(N'PHTGL_BidProjectQuantity'),
(N'PHTGL_Contract'),
(N'PHTGL_ContractReview'),
(N'PHTGL_ContractStandingBook'),
(N'PHTGL_ContractTrack'),
(N'PHTGL_ContractTrackMatchWBS'),
(N'PHTGL_ContractTrackProgress'),
(N'PHTGL_Invoice'),
(N'PHTGL_InvoiceDetail'),
(N'PHTGL_MainProjectQuantity'),
(N'PHTGL_Quantity'),
(N'PHTGL_SetSubReview'),
(N'PHTGL_SetSubReview_Sch1'),
(N'PHTGL_SetSubReview_Sch2'),
(N'PHTGL_SpecialTermsConditions'),
(N'PHTGL_SubcontractAgreement'),
(N'ZHGL_ConstructionLogHJGL'),
(N'ZHGL_ConstructionLogManagement'),
(N'ZHGL_ConstructionLogProblem'),
(N'ZHGL_ConstructionLogRecord'),
(N'ZHGL_ConstructionLogWorkEfficiencyCompany'),
(N'ZHGL_ConstructionLogWorkEfficiencyMonth'),
(N'ZHGL_ConstructionLogWorkEfficiencyProject'),
(N'ZHGL_ConstructionMonthReport'),
(N'ZHGL_ConstructionMonthReportMainCost'),
(N'ZHGL_ConstructionMonthReportSubCost'),
(N'ZHGL_ConstructionPlan'),
(N'ZHGL_ConstructionPlanApprove'),
(N'ZHGL_ConstructionReport'),
(N'ZHGL_ConstructionReportApprove'),
(N'ZHGL_ProjectConstructionLog'),
(N'ZHGL_WorkHandover'),
(N'ZHGL_WorkHandoverApprove'),
(N'ZHGL_WorkHandoverDetail');
DECLARE @KeepTables TABLE
(
TableName sysname NOT NULL PRIMARY KEY
);
INSERT INTO @KeepTables (TableName)
VALUES
(N'ZHGL_ConstructionLog'),
(N'ZHGL_ConstructionLogMachine'),
(N'ZHGL_ConstructionLogPerson'),
(N'ZHGL_ConstructionLogWorkEfficiency'),
(N'WBS_ControlItemInit'),
(N'WBS_ControlItemProject'),
(N'WBS_UnitWork'),
(N'WBS_WorkPackageInit'),
(N'WBS_WorkPackageProject');
IF EXISTS
(
SELECT 1
FROM @KeepTables k
LEFT JOIN sys.tables t
ON t.schema_id = SCHEMA_ID(N'dbo')
AND t.name = k.TableName
WHERE t.object_id IS NULL
)
BEGIN
SELECT k.TableName AS MissingKeepTable
FROM @KeepTables k
LEFT JOIN sys.tables t
ON t.schema_id = SCHEMA_ID(N'dbo')
AND t.name = k.TableName
WHERE t.object_id IS NULL;
RAISERROR(N'存在需要保留但当前数据库中不存在的表,已停止执行。', 16, 1);
RETURN;
END;
SELECT
d.TableName,
CASE WHEN t.object_id IS NULL THEN N'不存在/已清理' ELSE N'待删除' END AS CleanupStatus
FROM @DropTables d
LEFT JOIN sys.tables t
ON t.schema_id = SCHEMA_ID(N'dbo')
AND t.name = d.TableName
ORDER BY d.TableName;
BEGIN TRY
BEGIN TRANSACTION;
DECLARE @Sql nvarchar(max) = N'';
/* 删除所有与目标表有关的外键,包括保留焊接表指向目标表的外键。 */
SELECT @Sql = @Sql
+ N'ALTER TABLE ' + QUOTENAME(OBJECT_SCHEMA_NAME(fk.parent_object_id))
+ N'.' + QUOTENAME(OBJECT_NAME(fk.parent_object_id))
+ N' DROP CONSTRAINT ' + QUOTENAME(fk.name) + N';' + CHAR(13) + CHAR(10)
FROM sys.foreign_keys fk
WHERE EXISTS
(
SELECT 1
FROM @DropTables d
JOIN sys.tables t
ON t.schema_id = SCHEMA_ID(N'dbo')
AND t.name = d.TableName
WHERE t.object_id = fk.parent_object_id
OR t.object_id = fk.referenced_object_id
);
IF @Sql <> N''
EXEC sys.sp_executesql @Sql;
SET @Sql = N'';
SELECT @Sql = @Sql
+ N'DROP TABLE ' + QUOTENAME(N'dbo') + N'.' + QUOTENAME(t.name) + N';'
+ CHAR(13) + CHAR(10)
FROM @DropTables d
JOIN sys.tables t
ON t.schema_id = SCHEMA_ID(N'dbo')
AND t.name = d.TableName;
IF @Sql <> N''
EXEC sys.sp_executesql @Sql;
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0
ROLLBACK TRANSACTION;
THROW;
END CATCH;
/* 执行后核验:目标表为 0,保留表仍存在。 */
SELECT N'RemainingTargetTables' AS Metric, COUNT(*) AS Value
FROM sys.tables t
JOIN @DropTables d ON d.TableName = t.name
WHERE t.schema_id = SCHEMA_ID(N'dbo');
SELECT N'RetainedWeldingTables' AS Metric, COUNT(*) AS Value
FROM sys.tables t
JOIN @KeepTables k ON k.TableName = t.name
WHERE t.schema_id = SCHEMA_ID(N'dbo')
AND k.TableName LIKE N'ZHGL[_]%';
SELECT N'WBS_ControlItemInit' AS Metric, COUNT_BIG(*) AS Value FROM dbo.WBS_ControlItemInit
UNION ALL SELECT N'WBS_ControlItemProject', COUNT_BIG(*) FROM dbo.WBS_ControlItemProject
UNION ALL SELECT N'WBS_UnitWork', COUNT_BIG(*) FROM dbo.WBS_UnitWork
UNION ALL SELECT N'WBS_WorkPackageInit', COUNT_BIG(*) FROM dbo.WBS_WorkPackageInit
UNION ALL SELECT N'WBS_WorkPackageProject', COUNT_BIG(*) FROM dbo.WBS_WorkPackageProject;
SELECT
fk.name AS ForeignKeyName,
OBJECT_SCHEMA_NAME(fk.parent_object_id) AS ParentSchema,
OBJECT_NAME(fk.parent_object_id) AS ParentTable,
OBJECT_SCHEMA_NAME(fk.referenced_object_id) AS ReferencedSchema,
OBJECT_NAME(fk.referenced_object_id) AS ReferencedTable
FROM sys.foreign_keys fk
WHERE fk.parent_object_id IN
(
SELECT t.object_id
FROM sys.tables t
JOIN @KeepTables k ON k.TableName = t.name
WHERE t.schema_id = SCHEMA_ID(N'dbo')
AND k.TableName LIKE N'ZHGL[_]%'
)
ORDER BY ParentTable, ForeignKeyName;