/* CQMS 首批确认清理执行脚本 目标库:SGGLDB_SHJ 已确认删除: - 综合管理:综合交底、图纸会审、设计明细、检试验人员/设备、特设质保体系 - 质量计划:总包/分包质量计划、技术方案评审 - 施工方案:CQMS 专属施工方案及审批 - 不合格项联系单、质量奖惩、质量培训、质量样板 - 项目现场亮点、质量报表、CQMS 质量会议、QC 小组注册 - 材料试验、施工试验、告知和监检、CQMS 设备台账 - 上述模块专属基础字典及项目级汇总表 明确保留: - CQMS 人员管理(含 HTGL 人员 API) - CQMS WBS 及其 Check_CheckControl、Check_SpotCheck 相关表 - 焊接相关数据及共享的 Material_Material、Material_Inspection、Material_InspectionApprove - Check_CheckEquipment 检试验设备、Technical_TechnicalDisclose 技术交底 - HSSE 施工方案、HSSE 培训、HSSE 安全会议 - 旧版 WebService 仍使用的 Information_QuarterlyProjectQuality - CQMSData_CQMS、Project_CQMSData_CQMS 等共享统计表 说明: - 数据库已由用户提前备份,本脚本不再执行备份。 - @ExecuteCleanup 已按用户确认设置为 1,执行前仍会校验数据库名和保护表。 - 脚本会在同一事务中删除目标外键、目标表及精确菜单权限记录,可重复执行。 - 不删除 WBS、人员、焊接共享表,也不删除 Sys_Button 定义。 */ 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 @ExecuteCleanup bit = 1; DECLARE @DropTables TABLE ( TableName sysname NOT NULL PRIMARY KEY, CleanupGroup nvarchar(100) NOT NULL ); INSERT INTO @DropTables (TableName, CleanupGroup) VALUES (N'Base_CompanyModel', N'质量样板'), (N'Base_CompanyModelKind', N'质量样板'), (N'Base_ConstructionTestType', N'施工试验字典'), (N'Base_NoticeAndSupervisionType', N'告知和监检字典'), (N'Base_CQMSTrainObject', N'质量培训字典'), (N'Base_CQMSTrainType', N'质量培训字典'), (N'Base_ProjectHighlightsSiteType', N'项目现场亮点字典'), (N'Base_PunishType', N'质量奖惩字典'), (N'Base_RewardType', N'质量奖惩字典'), (N'Comprehensive_ConTechnologyDisclosure', N'综合管理'), (N'Comprehensive_DesignDetails', N'综合管理'), (N'Comprehensive_DesignDetailsApprove', N'综合管理'), (N'Comprehensive_InspectionMachine', N'综合管理'), (N'Comprehensive_InspectionMachineApprove', N'综合管理'), (N'Comprehensive_InspectionMachinePlan', N'综合管理'), (N'Comprehensive_InspectionPerson', N'综合管理'), (N'Comprehensive_InspectionPersonApprove', N'综合管理'), (N'Comprehensive_QualityAssurance', N'综合管理'), (N'Comprehensive_ReviewDrawings', N'综合管理'), (N'CQMS_ProjectHighlightsSitePic', N'项目现场亮点'), (N'InformationProject_QualityWorkSummaryReport', N'质量报表'), (N'InformationProject_QuarterlyProjectQuality', N'质量报表'), (N'Material_ConstructionTest', N'施工试验'), (N'Material_Equipment', N'设备台账'), (N'Material_MaterialTest', N'材料试验'), (N'Material_NoticeAndSupervision', N'告知和监检'), (N'Meeting_CQMSMeeting', N'质量会议'), (N'Meeting_CQMSMeetingApprove', N'质量会议'), (N'Model_QualityModel', N'质量样板'), (N'Plan_MainPlan', N'质量计划'), (N'Plan_MainPlanApprove', N'质量计划'), (N'Plan_SubPlan', N'质量计划'), (N'Plan_SubPlanApprove', N'质量计划'), (N'Plan_TechnicalProposalReview', N'质量计划'), (N'QCManage_QCGroupRegistration', N'QC 活动'), (N'RewardAndPunish_RewardAndPunish', N'质量奖惩'), (N'RewardAndPunish_RewardAndPunishApprove', N'质量奖惩'), (N'Solution_CQMSConstructSolution', N'施工方案'), (N'Solution_CQMSConstructSolutionApprove', N'施工方案'), (N'Train_TrainPlan', N'质量培训'), (N'Unqualified_WorkContact', N'不合格项联系单'), (N'Unqualified_WorkContactApprove', N'不合格项联系单'); DECLARE @MenuIds TABLE ( MenuId nvarchar(100) NOT NULL PRIMARY KEY, MenuName nvarchar(100) NOT NULL ); /* 只保留从当前菜单 XML 中核对过的目标节点,不按名称模糊删除。 */ INSERT INTO @MenuIds (MenuId, MenuName) VALUES (N'34A3DBD0-1472-4D99-B2A4-21F0AF3227BD', N'质量计划'), (N'02970CE5-1A63-4DED-83B2-B283E7E68A1F', N'总包施工质量计划'), (N'68DA6E87-1016-4225-AA80-117E788EEE9B', N'分包施工质量计划'), (N'D438ADBD-5A1C-44F5-A6D7-E4270469DE0F', N'项目技术方案评审'), (N'C9E75EEC-6A93-4313-89EB-E24E05CAC4F1', N'设备信息'), (N'F07ADB87-F2B4-4D31-A38C-3EC4F32F08C4', N'试验检验管理'), (N'DA501F39-86A4-4315-9D3B-1E341DE75B9D', N'材料试验'), (N'3AE88614-052D-413D-ACC3-190CEB195F90', N'施工试验'), (N'88822AAB-A13F-4ECA-B2ED-592321CDB173', N'告知和监检管理'), (N'2C49EC5E-BF6F-4C44-BA02-9BD183CF68C6', N'特设质保体系'), (N'09887155-4DEF-4B9A-A15A-0CE8DE81B75A', N'质量培训'), (N'E73622CA-1520-4A79-A355-81C08C60A08D', N'培训计划'), (N'C062AD89-3C3A-4DA1-AB8A-53E2BD5E5D2D', N'培训记录'), (N'BBBF69F1-9520-4E0A-B0C0-9F4D3FBF4C10', N'施工方案管理'), (N'91C4BFDB-0A51-4992-99CC-EB4EC185593D', N'施工方案'), (N'A16CFA9D-2783-4573-95F9-EBA2B682B7EA', N'施工技术交底管理'), (N'856D53B3-C5FB-443F-917B-39E83BE685DB', N'图纸会审管理'), (N'5708024C-CD74-42CD-839C-2E4FD83D1897', N'QC管理'), (N'8B1DFB6D-B48C-4FAB-821F-25AD582DBFAB', N'QC小组注册'), (N'B1D48FD8-F44A-46DD-AB9F-6D431365F6D1', N'QC统计'), (N'53A5EF93-F0F0-4416-A5F8-1AEC37C0C622', N'质量会议'), (N'CB0754F9-55D3-4AA3-8E8D-82F11884DAB7', N'质量月例会'), (N'31A86992-5FB9-4525-AE97-E2E9E28FACE8', N'质量专题会'), (N'AB393E2F-7CC9-4ED2-AD32-202A961ED45D', N'项目现场亮点'), (N'D81AE7C1-2022-4089-B0F9-49903798DEEF', N'项目现场亮点照片'), (N'42106F55-BE3A-4252-8D4D-0793E4777524', N'项目现场亮点'), (N'67F04484-EC26-49AA-BFB4-6CF5DB06F8CA', N'项目现场亮点类型'), (N'38177E89-4BA8-4D66-AFB9-93644DFE7451', N'项目现场亮点照片'), (N'3156A9F0-276D-4AD4-BF84-45CF6DFC215C', N'企业安全数据统计月报'), (N'4BC71D2E-7D94-48C1-A61A-139637825AA5', N'职工伤亡事故原因分析报'), (N'7985C759-8EB9-4B7D-AC65-00541280B46C', N'应急演练开展情况季报'), (N'70DEB27A-D6FF-4D57-879B-0270F2967FA0', N'应急演练工作计划半年报'), (N'AAC7C263-6E25-49DC-985B-DC3FA7AAF3A1', N'实业安全简报'), (N'07FEEC9D-09C1-4C19-9269-62F69532086C', N'安全管理工作总结报告'), (N'CF9C1F00-34B8-42E5-B2D1-704094169CA3', N'季度工程项目质量信息表'), (N'12941594-2171-411A-8CC8-32E3BD9FCDDF', N'质量管理工作总结报告'), (N'5B344750-79DD-40AA-8AA7-34B04E41FA72', N'生态环保工作总结报告'), (N'CB76394B-BDEB-4F45-9D19-F38612DC6591', N'安全生产治本攻坚三年行动工作台账'), (N'C48087A8-4C9F-485D-B0A4-C85E112BA705', N'安全生产管理评价工作调度台账'), (N'76E236DA-DDFC-4CE8-8CB8-02F8A27A8535', N'专业技术方案评审'), (N'B9ADD006-BA46-4191-BCD1-CCB56767C82B', N'总包施工质量计划'), (N'6F9F1B71-67D8-4297-8F9B-360F3695E84B', N'项目策划'), (N'D36E568B-54A3-4E86-919E-407C605B7BFC', N'总包合同'), (N'0E6C41F0-3231-4030-BCBC-0872E7C41383', N'项目技术方案评审'), (N'35BA8E89-4575-4A3F-9C22-98B323E67DA1', N'重点工程项目质量专项整治行动开展情况台账'), (N'2539A5CE-E209-4A16-A9B7-4C43E4E3CBEC', N'进度文件柜'), (N'F596EC1A-71A3-4B34-B36C-68628F2F42FE', N'合同文件柜'), (N'BA383490-BAE3-4E65-B221-8F89D2431135', N'质量奖惩'), (N'81053EAB-09C6-4A6B-A952-B756071EE0DA', N'质量奖励处罚'), (N'7ecf0229-8a0b-40ce-8b04-e556f7bd3394', N'质量报表管理'), (N'1443C901-A9C3-4CCC-B858-55512DE8C5CA', N'质量管理工作总结报告'), (N'267064F1-88F7-4468-998A-49A1A2F25BB8', N'季度工程项目质量信息表'), (N'F54EABD2-4242-4A5D-9154-680E02E9F466', N'质量样板管理'), (N'B44EC915-7854-4F06-8C87-CD5FF41E3AC0', N'质量样板'), (N'B9CE4D86-4A6E-42B2-8736-15595B3C57FC', N'质量月例会'), (N'9F7C7E64-2743-4CF0-B09E-DDB43444A69A', N'质量专题会'), (N'F32B7E91-693F-4892-93EE-7AEAC1309291', N'施工组织设计(施工方案)内部审批流转单'), (N'0BA0735E-2EFE-4E31-B7DD-A62E5F1E7BBD', N'施工试验类型定义'), (N'CCD45D20-EA3F-47E7-8176-AB085778539E', N'告知和监检类型定义'), (N'B9372A07-8A93-4EC0-9374-FDE1ED958DAE', N'公司质量样板类别'), (N'99C99DF8-103F-4CA4-83CB-A6C924B5A698', N'公司质量样板'), (N'164CDCED-E794-4177-AADE-23CA8E1AA1B8', N'培训类别'), (N'D2027C3D-ECE9-445E-8DBE-AF0DA10005FC', N'培训对象'), (N'E20647B6-315D-483B-8E5D-4810DBECE79E', N'质量奖惩定义'), (N'84DB3C33-8828-407B-8B8A-5E98AD610FA6', N'奖励定义'), (N'92DF46C6-1CE4-4324-A3F2-EBC6261376AC', N'处罚定义'); DECLARE @LegacyMenuTypes TABLE ( MenuType nvarchar(50) NOT NULL PRIMARY KEY ); INSERT INTO @LegacyMenuTypes (MenuType) VALUES (N'Menu_HTGL'), (N'Menu_JDGL'), (N'Menu_PHTGL'), (N'Menu_PZHGL'); DECLARE @LegacyMenuIds TABLE ( MenuId nvarchar(100) NOT NULL PRIMARY KEY ); INSERT INTO @LegacyMenuIds (MenuId) SELECT m.MenuId FROM dbo.Sys_Menu m JOIN @LegacyMenuTypes t ON t.MenuType = m.MenuType; DECLARE @ProtectedTables TABLE ( TableName sysname NOT NULL PRIMARY KEY, ProtectionNote nvarchar(200) NOT NULL ); INSERT INTO @ProtectedTables (TableName, ProtectionNote) VALUES (N'Person_Persons', N'人员管理及 HTGL 人员 API'), (N'SitePerson_Person', N'人员管理'), (N'Check_CheckControl', N'WBS 质量问题及控制点'), (N'Check_CheckControlApprove', N'WBS 质量问题审批'), (N'Check_CheckEquipment', N'共享检试验设备'), (N'Check_CheckEquipmentApprove', N'共享检试验设备审批'), (N'Check_SpotCheck', N'WBS 实体验收'), (N'Check_SpotCheckApprove', N'WBS 实体验收审批'), (N'Check_SpotCheckDetail', N'WBS 实体验收明细'), (N'Check_CheckMonth', N'质量月报及焊接数据'), (N'Check_MonthNDTCheck', N'焊接月报'), (N'Check_MonthWelder', N'焊接月报'), (N'Technical_TechnicalDisclose', N'保留技术交底'), (N'Material_Material', N'焊接共享物料'), (N'Material_Inspection', N'焊接共享检验'), (N'Material_InspectionApprove', N'焊接共享检验审批'), (N'Project_FileCabinet', N'共享文件柜'), (N'CQMSData_CQMS', N'共享 CQMS 汇总'), (N'Project_CQMSData_CQMS', N'共享项目 CQMS 汇总'); /* 执行前打印目标表数据量及保护对象状态。 */ SELECT d.CleanupGroup, d.TableName, CASE WHEN t.object_id IS NULL THEN N'不存在/已清理' ELSE N'待删除' END AS TableStatus, COALESCE(SUM(CASE WHEN p.index_id IN (0, 1) THEN p.rows ELSE 0 END), 0) AS [RowCount] FROM @DropTables d LEFT JOIN sys.tables t ON t.schema_id = SCHEMA_ID(N'dbo') AND t.name = d.TableName LEFT JOIN sys.partitions p ON p.object_id = t.object_id GROUP BY d.CleanupGroup, d.TableName, t.object_id ORDER BY d.CleanupGroup, d.TableName; SELECT p.TableName, p.ProtectionNote, CASE WHEN t.object_id IS NULL THEN N'缺失' ELSE N'存在' END AS TableStatus FROM @ProtectedTables p LEFT JOIN sys.tables t ON t.schema_id = SCHEMA_ID(N'dbo') AND t.name = p.TableName ORDER BY p.TableName; IF EXISTS ( SELECT 1 FROM @ProtectedTables p LEFT JOIN sys.tables t ON t.schema_id = SCHEMA_ID(N'dbo') AND t.name = p.TableName WHERE t.object_id IS NULL ) BEGIN RAISERROR(N'保护表缺失,已停止执行。', 16, 1); RETURN; END; IF @ExecuteCleanup = 0 BEGIN PRINT N'当前为预览模式,未删除任何数据库对象。'; RETURN; END; 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(OBJECT_SCHEMA_NAME(t.object_id)) + 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; /* 删除目标菜单和已确认废弃模块菜单的按钮权限、角色权限,再删除菜单行。 */ DELETE FROM dbo.Sys_ButtonPower WHERE MenuId IN (SELECT MenuId FROM @MenuIds) OR ButtonToMenuId IN (SELECT MenuId FROM @MenuIds) OR MenuId IN (SELECT MenuId FROM @LegacyMenuIds) OR ButtonToMenuId IN (SELECT MenuId FROM @LegacyMenuIds); DECLARE @DeletedButtonPower int = @@ROWCOUNT; DELETE FROM dbo.Sys_RolePower WHERE MenuId IN (SELECT MenuId FROM @MenuIds) OR MenuId IN (SELECT MenuId FROM @LegacyMenuIds); DECLARE @DeletedRolePower int = @@ROWCOUNT; DELETE FROM dbo.Sys_Menu WHERE MenuId IN (SELECT MenuId FROM @MenuIds) OR MenuType IN (SELECT MenuType FROM @LegacyMenuTypes); DECLARE @DeletedMenus int = @@ROWCOUNT; COMMIT TRANSACTION; SELECT @DeletedButtonPower AS DeletedSysButtonPower, @DeletedRolePower AS DeletedSysRolePower, @DeletedMenus AS DeletedSysMenu; END TRY BEGIN CATCH IF XACT_STATE() <> 0 ROLLBACK TRANSACTION; THROW; END CATCH; /* 执行后核验目标表、菜单及保护表。 */ 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; SELECT p.TableName, CASE WHEN t.object_id IS NULL THEN N'缺失' ELSE N'仍存在' END AS ProtectionStatus FROM @ProtectedTables p LEFT JOIN sys.tables t ON t.schema_id = SCHEMA_ID(N'dbo') AND t.name = p.TableName ORDER BY p.TableName; SELECT N'目标表剩余数量' 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'目标菜单剩余数量' AS Metric, COUNT(*) AS Value FROM dbo.Sys_Menu m JOIN @MenuIds i ON i.MenuId = m.MenuId; SELECT N'废弃模块菜单剩余数量' AS Metric, COUNT(*) AS Value FROM dbo.Sys_Menu m JOIN @LegacyMenuTypes t ON t.MenuType = m.MenuType; SELECT N'WBS表数量' AS Metric, COUNT(*) AS Value FROM sys.tables WHERE schema_id = SCHEMA_ID(N'dbo') AND name LIKE N'WBS[_]%'; SELECT TableName, SUM([RowCount]) AS [RowCount] FROM ( SELECT t.name AS TableName, CASE WHEN p.index_id IN (0, 1) THEN p.rows ELSE 0 END AS [RowCount] FROM sys.tables t LEFT JOIN sys.partitions p ON p.object_id = t.object_id WHERE t.schema_id = SCHEMA_ID(N'dbo') AND t.name IN ( N'WBS_ControlItemInit', N'WBS_ControlItemProject', N'WBS_UnitWork', N'WBS_WorkPackageInit', N'WBS_WorkPackageProject', N'Material_Material', N'Material_Inspection', N'Person_Persons' ) ) AS ProtectedData GROUP BY TableName ORDER BY TableName;