/* 陕化建施工管理系统历史模块清理脚本 目标库: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;