/* 陕化建施工管理系统安全管理收口清理脚本 目标库:SGGLDB_SHJ 删除范围: - HSSE 安全管理中除人员信息、人员资质、培训/考试外的旧业务表; - 已确认下线的事故、行动计划、隐患、应急、环境、作业票、会议、职业健康、 设备报批、质量设备/分包资质、方案、月报、实名制旧同步等专属表; - 安全专属基础字典、旧视图、旧存储过程及菜单权限残留。 明确保留: - SitePerson_*、Person_*、QualityAudit_PersonQuality、 QualityAudit_SafePersonQuality、QualityAudit_EquipmentPersonQuality; - Training_*、Test_*、Person_Training*; - WBS_*、HJGL_*、焊接共享质量表及质量检查表; - InformationProject_Notice、InformationProject_ReceiveFileManager; - RealName_BasicData、RealName_City、RealName_Country; - Base_CompanyTemplate、Base_Train*、Base_WorkPost 等仍被保留模块使用的表。 说明: - 用户已确认数据库此前完成备份,本脚本不再执行备份。 - 所有 DDL 在一个事务内执行;外键、视图、菜单权限均先处理。 - 脚本可重复执行,不存在的目标对象自动跳过。 - 不删除 SmartSite_*、Weather、Kqgl_DateManage 及人员/WBS/焊接/质量共享对象。 */ USE [SGGLDB_SHJ]; SET NOCOUNT ON; SET XACT_ABORT ON; IF DB_NAME() <> N'SGGLDB_SHJ' THROW 50000, N'当前数据库不是 SGGLDB_SHJ,已停止执行。', 1; BEGIN TRY BEGIN TRANSACTION; DECLARE @DropTables TABLE ( TableName sysname NOT NULL PRIMARY KEY, DropOrder tinyint NOT NULL ); INSERT INTO @DropTables (TableName, DropOrder) VALUES (N'Accident_AccidentHandle', 1), (N'Accident_AccidentPersonRecord', 1), (N'Accident_AccidentReport', 1), (N'Accident_AccidentReportOther', 1), (N'Accident_AccidentReportOtherItem', 1), (N'Accident_NoFourLetoff', 1), (N'ActionPlan_ActionPlanList', 1), (N'ActionPlan_ActionPlanListApprove', 1), (N'ActionPlan_CompanyManagerRule', 1), (N'ActionPlan_MainContract', 1), (N'ActionPlan_MainContractApprove', 1), (N'ActionPlan_MainContractOpinion', 1), (N'ActionPlan_ManagerRule', 1), (N'ActionPlan_ProjectManagerRule', 1), (N'ActionPlan_ProjectPlan', 1), (N'ActionPlan_ProjectPlanApprove', 1), (N'ActionPlan_ProjectPlanOpinion', 1), (N'Base_AccidentType', 1), (N'Base_EmergencyType', 1), (N'Base_HSSEStandardListType', 1), (N'Base_LawsRegulationsType', 1), (N'Base_LicenseType', 1), (N'Base_ManageRuleType', 1), (N'Base_RiskLevel', 1), (N'Base_SafetyMeasures', 1), (N'Base_SolutionTempleteType', 1), (N'Base_SpecialSchemeType', 1), (N'Base_SuperviseCheckType', 1), (N'Check_CheckColligation', 1), (N'Check_CheckColligationDetail', 1), (N'Check_CheckSpecial', 1), (N'Check_CheckSpecialDetail', 1), (N'Check_IncentiveNotice', 1), (N'Check_IncentiveNoticeFlowOperate', 1), (N'Check_PauseNotice', 1), (N'Check_PauseNoticeFlowOperate', 1), (N'Check_ProjectLeaderCheck', 1), (N'Check_PunishNotice', 1), (N'Check_PunishNoticeFlowOperate', 1), (N'Check_PunishNoticeItem', 1), (N'Check_RectifyNotices', 1), (N'Check_RectifyNoticesFlowOperate', 1), (N'Check_RectifyNoticesItem', 1), (N'CostGoods_CostManage', 1), (N'CostGoods_CostManageFlowOperate', 1), (N'CostGoods_CostManageItem', 1), (N'CostGoods_CostSmallDetail', 1), (N'CostGoods_CostSmallDetailItem', 1), (N'CostGoods_Expense', 1), (N'CostGoods_ExpenseDetail', 1), (N'DigData_HSEDataCollect', 1), (N'DigData_HSEDataCollectItem', 1), (N'DigData_HSEDataCollectSubmission', 1), (N'EduTrain_AccidentCase', 1), (N'EduTrain_AccidentCaseItem', 1), (N'EduTrain_TrainPersonRecord', 1), (N'EduTrain_TrainRecord', 1), (N'EduTrain_TrainRecordDetail', 1), (N'EduTrain_TrainTest', 1), (N'Emergency_DrillRecordList', 1), (N'Emergency_EmergencyList', 1), (N'Emergency_EmergencyProcess', 1), (N'Emergency_EmergencyProcessItem', 1), (N'Emergency_EmergencySupply', 1), (N'Emergency_EmergencyTeamAndTrain', 1), (N'Emergency_EmergencyTeamItem', 1), (N'Environmental_EIAReport', 1), (N'Environmental_EnvironmentalEmergencyPlan', 1), (N'Environmental_EnvironmentalMonitoring', 1), (N'Environmental_UnexpectedEnvironmental', 1), (N'EnvironmentalCheck', 1), (N'Hazard_EnvironmentalRiskItem', 1), (N'Hazard_EnvironmentalRiskList', 1), (N'Hazard_HazardList', 1), (N'Hazard_HazardSelectedItem', 1), (N'Hazard_RealTimeDevice', 1), (N'Hazard_RealTimeValue', 1), (N'HSSE_ConstructionRisk', 1), (N'HSSE_ConstructionRiskApprove', 1), (N'HSSE_ConstructionRiskCheck', 1), (N'HSSE_ConstructionRiskControl', 1), (N'HSSE_Hazard_HazardRegister', 1), (N'HSSE_Hazard_HazardRegisterTypes', 1), (N'HSSE_Weather', 1), (N'HSSEData_HiddenDangerDetail', 1), (N'HSSEData_HSSE', 1), (N'HSSESystem_HSSEMainDuty', 1), (N'HSSESystem_SafetyInstitution', 1), (N'InApproveManager_EquipmentIn', 1), (N'InApproveManager_EquipmentInItem', 1), (N'InApproveManager_EquipmentOut', 1), (N'InApproveManager_EquipmentOutItem', 1), (N'InApproveManager_EquipmentQualityIn', 1), (N'InApproveManager_EquipmentQualityInItem', 1), (N'InApproveManager_GeneralEquipmentIn', 1), (N'InApproveManager_GeneralEquipmentInItem', 1), (N'InApproveManager_GeneralEquipmentOut', 1), (N'InApproveManager_GeneralEquipmentOutItem', 1), (N'Information_MillionsMonthlyReport', 1), (N'Information_MillionsMonthlyReportItem', 1), (N'InformationProject_Picture', 1), (N'InformationProject_ProjectMap', 1), (N'Law_HSSEStandardsList', 1), (N'Law_LawRegulationList', 1), (N'Law_LawRegulationSelectedItem', 1), (N'Law_ManageRule', 1), (N'Law_RulesRegulations', 1), (N'License_BreakGround', 1), (N'License_FireWork', 1), (N'License_FlowOperate', 1), (N'License_FlowOperateItem', 1), (N'License_HeightWork', 1), (N'License_HSETechnical', 1), (N'License_LicenseItem', 1), (N'License_LicenseManager', 1), (N'License_LiftingWork', 1), (N'License_LimitedSpace', 1), (N'License_NightWork', 1), (N'License_OpenCircuit', 1), (N'License_RadialWork', 1), (N'Manager_CompletionReport', 1), (N'Meeting_AttendMeeting', 1), (N'Meeting_ClassMeeting', 1), (N'Meeting_MonthMeeting', 1), (N'Meeting_SafetyLeaderGroupMeeting', 1), (N'Meeting_SpecialMeeting', 1), (N'Meeting_WeekMeeting', 1), (N'OccupationHealth_HazardDetection', 1), (N'OccupationHealth_OccupationalDiseaseAccident', 1), (N'OccupationHealth_PhysicalExamination', 1), (N'ProcessControl_InspectionManagement', 1), (N'ProcessControl_InspectionManagementApprove', 1), (N'ProcessControl_InspectionManagementDetail', 1), (N'Project_HSEDiary', 1), (N'Project_HSSEData_HiddenDangerDetail', 1), (N'Project_HSSEData_HSSE', 1), (N'Project_SYHSEData_SYHSE', 1), (N'QualityAudit_EquipmentQuality', 1), (N'QualityAudit_EquipmentQualityAuditDetail', 1), (N'QualityAudit_GeneralEquipmentQuality', 1), (N'QualityAudit_SubUnitQuality', 1), (N'QualityAudit_SubUnitQualityAuditDetail', 1), (N'Resources_SignManage', 1), (N'SecuritySystem_SafetyOrganization', 1), (N'SeDin_MonthReport', 1), (N'SeDin_MonthReport1', 1), (N'SeDin_MonthReport10', 1), (N'SeDin_MonthReport11', 1), (N'SeDin_MonthReport12', 1), (N'SeDin_MonthReport2', 1), (N'SeDin_MonthReport3', 1), (N'SeDin_MonthReport4', 1), (N'SeDin_MonthReport4Other', 1), (N'SeDin_MonthReport5', 1), (N'SeDin_MonthReport6', 1), (N'SeDin_MonthReport7', 1), (N'SeDin_MonthReport8', 1), (N'SeDin_MonthReport8Item', 1), (N'SeDin_MonthReport9', 1), (N'SeDin_MonthReport9Item_Rectification', 1), (N'SeDin_MonthReport9Item_Special', 1), (N'SeDin_MonthReport9Item_Stoppage', 1), (N'SeDin_MonthReportFlowOperate', 1), (N'Solution_ConstructSolution', 1), (N'Solution_ExpertArgument', 1), (N'Solution_LargerHazard', 1), (N'Solution_LargerHazardList', 1), (N'Solution_LargerHazardListItem', 1), (N'Solution_SolutionTemplate', 1), (N'Solution_TemporaryElectricity', 1), (N'SYHSEData_Data', 1), (N'SYHSEData_HiddenDangerCheck', 1), (N'SYHSEData_RiskControl', 1), (N'SYHSEData_SYHSE', 1), (N'Technique_CheckItemDetail', 1), (N'Technique_CheckItemSet', 1), (N'Technique_Emergency', 1), (N'Technique_Environmental', 1), (N'Technique_HazardList', 1), (N'Technique_HazardListType', 1), (N'Technique_ProjectSolutionTemplete', 1), (N'Technique_Rectify', 1), (N'Technique_RectifyItem', 1), (N'Technique_SpecialScheme', 1), (N'RealName_CollTeam', 1), (N'RealName_PersonInOutNow', 1), (N'RealName_Project', 1), (N'RealName_PushLog', 1), (N'RealName_SynchroSet', 1); DECLARE @DropViews TABLE ( ViewName sysname NOT NULL PRIMARY KEY ); INSERT INTO @DropViews (ViewName) VALUES (N'V_SeDin_MonthReport3'), (N'View_ActionPlan_ManagerRule'), (N'View_Check_CheckColligationDetail'), (N'View_CheckSpecialDetail'), (N'View_DataIn_MillionsMonthlyReport'), (N'View_DataStatistics'), (N'View_EduTrain_TrainFind'), (N'View_EduTrain_TrainRecordDetail'), (N'View_EduTrain_TrainTest'), (N'View_Emergency_EmergencyTeamItem'), (N'View_Hazard_EnvironmentalRiskItem'), (N'View_Hazard_HazardRegister'), (N'View_Hazard_HazardRegisterList'), (N'View_HSSESystem_SafetyInstitution'), (N'View_Information_MillionsMonthlyReport'), (N'View_Law_LawRegulationList'), (N'View_Law_LawRegulationSelectedItem'), (N'View_Law_ManageRule'), (N'View_Law_RulesRegulations'), (N'View_License_LicenseManager'), (N'View_Project_HSSEData_HSSE'), (N'View_QualityAudit_EquipmentQuality'), (N'View_QualityAudit_EquipmentQualityAuditDetail'), (N'View_QualityAudit_SubUnitQuality'), (N'View_QualityAudit_SubUnitQualityAuditDetail'), (N'View_Solution_LargerHazardListItem'), (N'View_Technique_Emergency'), (N'View_Technique_RectifyItem'), (N'View_Technique_SpecialScheme'); DECLARE @DropProcedures TABLE ( ProcedureName sysname NOT NULL PRIMARY KEY ); INSERT INTO @DropProcedures (ProcedureName) VALUES (N'Sp_DataStatistics'), (N'Sp_DigData_HSEDataCollect'), (N'Sp_Hazard_EnvironmentalRiskListReport'), (N'Sp_Hazard_EnvironmentalRiskListReportImportantItem'), (N'Sp_Hazard_EnvironmentalRiskListReportItem'), (N'Sp_Hazard_HazardListReport'), (N'Sp_Hazard_HazardSelectedItemImportantReport'), (N'Sp_Hazard_HazardSelectedItemReport'), (N'Sp_Project_GetToDoItems'), (N'SP_RectifyNoticesListByProjectStates'), (N'SpCheckColligationStatistic'); DECLARE @DropMenuIds TABLE ( MenuId nvarchar(100) NOT NULL PRIMARY KEY ); /* 删除已下线安全菜单;SitePerson 和人员资质菜单明确保留。 */ INSERT INTO @DropMenuIds (MenuId) SELECT DISTINCT m.MenuId FROM dbo.Sys_Menu AS m WHERE (m.Url LIKE N'HSSE/%' AND m.Url NOT LIKE N'HSSE/SitePerson/%' AND m.Url NOT IN ( N'HSSE/QualityAudit/PersonQuality.aspx', N'HSSE/QualityAudit/SafePersonQuality.aspx', N'HSSE/QualityAudit/EquipmentPersonQuality.aspx' )) OR m.Url LIKE N'ZHGL/Plan/ActionPlan%' OR m.Url LIKE N'ZHGL/DataSync/HSSEData%' OR m.Url LIKE N'ZHGL/DataSync/SYHSEData%' OR m.Url LIKE N'ZHGL/DataSync/Project_HSSEData%' OR m.Url LIKE N'ZHGL/DataSync/DataStatistics%' OR m.Url LIKE N'/ZHGL/Supervise/%' OR m.Url LIKE N'CQMS/Technique/%' OR m.Url LIKE N'DigData/HSE%' OR m.Url LIKE N'DigData/TrainRecordAnalysis%' OR m.Url LIKE N'DigData/DailyProblemAnalysis%' OR m.Url LIKE N'DigData/RectifyProblemAnalysis%' OR m.Url LIKE N'%DataShow/%' OR m.Url LIKE N'%OfficeCheck%' OR m.Url LIKE N'%ProjectMap%' OR m.Url LIKE N'%PHTGL%' OR m.Url LIKE N'%JDGL%' OR m.Url LIKE N'%PZHGL%'; /* 同时收口只剩已删除子菜单的安全父节点,含保留子菜单的父节点不会被选中。 */ WHILE 1 = 1 BEGIN INSERT INTO @DropMenuIds (MenuId) SELECT DISTINCT parent_menu.MenuId FROM dbo.Sys_Menu AS parent_menu WHERE parent_menu.MenuId IN ( SELECT child_menu.SuperMenu FROM dbo.Sys_Menu AS child_menu JOIN @DropMenuIds AS dropped_child ON dropped_child.MenuId = child_menu.MenuId WHERE child_menu.SuperMenu IS NOT NULL AND child_menu.SuperMenu <> N'0' ) AND NOT EXISTS ( SELECT 1 FROM dbo.Sys_Menu AS child_menu WHERE child_menu.SuperMenu = parent_menu.MenuId AND NOT EXISTS ( SELECT 1 FROM @DropMenuIds AS dropped_child WHERE dropped_child.MenuId = child_menu.MenuId ) ) AND NOT EXISTS ( SELECT 1 FROM @DropMenuIds AS already_dropped WHERE already_dropped.MenuId = parent_menu.MenuId ); IF @@ROWCOUNT = 0 BREAK; END; DECLARE @Sql nvarchar(max); DECLARE @ObjectDefinition nvarchar(max); DECLARE @StartPosition int; DECLARE @EndPosition int; /* 人员列表视图原来引用已下线 EduTrain 表,保留视图并改用当前培训任务统计。 */ IF OBJECT_ID(N'dbo.View_SitePerson_Person', N'V') IS NOT NULL BEGIN SET @ObjectDefinition = OBJECT_DEFINITION(OBJECT_ID(N'dbo.View_SitePerson_Person')); SET @ObjectDefinition = REPLACE(@ObjectDefinition, N'CREATE VIEW', N'ALTER VIEW'); SET @StartPosition = CHARINDEX(N'(SELECT COUNT(*) FROM EduTrain_TrainRecordDetail', @ObjectDefinition); SET @EndPosition = CHARINDEX(N' AS TrainCount,', @ObjectDefinition, @StartPosition); IF @StartPosition <= 0 OR @EndPosition <= @StartPosition THROW 50001, N'View_SitePerson_Person 未找到旧 EduTrain 统计片段,已停止执行。', 1; SET @ObjectDefinition = STUFF ( @ObjectDefinition, @StartPosition, @EndPosition - @StartPosition, N'(SELECT COUNT(*) FROM Training_Task AS T WHERE T.UserId = SitePerson.PersonId AND T.ProjectId = SitePerson.ProjectId)' ); EXEC sys.sp_executesql @ObjectDefinition; END; /* APP 待办只保留培训/考试、现场人员和人员资质待办。 */ IF OBJECT_ID(N'dbo.Sp_APP_GetToDoItems', N'P') IS NOT NULL BEGIN SET @Sql = N' ALTER PROCEDURE dbo.Sp_APP_GetToDoItems @projectId NVARCHAR(50) = NULL, @personId NVARCHAR(200) = NULL AS BEGIN SELECT plans.PlanId AS DataId, ''B782A26B-D85C-4F84-8B45-F7AA47B3159E'' AS MenuId, N''培训计划'' AS MenuName, plans.PlanName AS Content, persons.PersonId, persons.PersonName, plans.DesignerDate AS DataTime, CONVERT(varchar(100), plans.DesignerDate, 23) AS DataTimeStr, ''/pages/train_task/train_index/main'' AS UrlStr, N'''' AS pcUrl FROM dbo.Training_Plan AS plans LEFT JOIN dbo.Person_Persons AS persons ON plans.DesignerId = persons.PersonId WHERE plans.ProjectId = @projectId AND (plans.States = ''0'' OR plans.States = ''1'') AND plans.DesignerId = @personId UNION ALL SELECT test_plan.TestPlanId AS DataId, ''FAF7F4A4-A4BC-4D94-9E88-0CF5A380DB34'' AS MenuId, N''考试计划'' AS MenuName, test_plan.PlanName AS Content, persons.PersonId, persons.PersonName, test_plan.PlanDate AS DataTime, CONVERT(varchar(100), test_plan.PlanDate, 23) AS DataTimeStr, ''/pages/train_task/test_list/main'' AS UrlStr, N'''' AS pcUrl FROM dbo.Training_TestPlan AS test_plan LEFT JOIN dbo.Person_Persons AS persons ON test_plan.PlanManId = persons.PersonId WHERE test_plan.ProjectId = @projectId AND (test_plan.States = ''0'' OR test_plan.States = ''1'') AND test_plan.PlanManId = @personId UNION ALL SELECT site_person.SitePersonId AS DataId, ''EE260447-028F-46AF-8864-9A5DC9DAA5BD'' AS MenuId, N''现场人员'' AS MenuName, site_person.PersonName AS Content, persons.PersonId, persons.PersonName, site_person.InTime AS DataTime, CONVERT(varchar(100), site_person.InTime, 23) AS DataTimeStr, ''/pages/info/people_detail/main'' AS UrlStr, N'''' AS pcUrl FROM dbo.SitePerson_Person AS site_person LEFT JOIN dbo.Person_Persons AS persons ON persons.PersonId = @personId WHERE site_person.ProjectId = @projectId AND site_person.States = ''1'' AND site_person.AuditorId = @personId AND site_person.AuditorDate IS NULL UNION ALL SELECT quality.PersonQualityId AS DataId, ''EBEA762D-1F46-47C5-9EAD-759E13D9B41C'' AS MenuId, N''特种作业人员'' AS MenuName, site_person.PersonName AS Content, persons.PersonId, persons.PersonName, quality.CompileDate AS DataTime, CONVERT(varchar(100), quality.CompileDate, 23) AS DataTimeStr, ''/pages/info/speople_detail/main'' AS UrlStr, N'''' AS pcUrl FROM dbo.QualityAudit_PersonQuality AS quality LEFT JOIN dbo.SitePerson_Person AS site_person ON site_person.PersonId = quality.PersonId LEFT JOIN dbo.Person_Persons AS persons ON persons.PersonId = @personId WHERE site_person.ProjectId = @projectId AND quality.AuditorId = @personId AND quality.States = ''1'' UNION ALL SELECT quality.SafePersonQualityId AS DataId, ''750F5074-45B9-470E-AE1E-6204957421E6'' AS MenuId, N''安管人员'' AS MenuName, site_person.PersonName AS Content, persons.PersonId, persons.PersonName, quality.CompileDate AS DataTime, CONVERT(varchar(100), quality.CompileDate, 23) AS DataTimeStr, ''/pages/info/speople_detail/main'' AS UrlStr, N'''' AS pcUrl FROM dbo.QualityAudit_SafePersonQuality AS quality LEFT JOIN dbo.SitePerson_Person AS site_person ON site_person.PersonId = quality.PersonId LEFT JOIN dbo.Person_Persons AS persons ON persons.PersonId = @personId WHERE site_person.ProjectId = @projectId AND quality.AuditorId = @personId AND quality.States = ''1'' UNION ALL SELECT quality.EquipmentPersonQualityId AS DataId, ''96FB96FF-20D8-4CE9-AF57-C19717BB5D3E'' AS MenuId, N''特种设备作业人员'' AS MenuName, site_person.PersonName AS Content, persons.PersonId, persons.PersonName, quality.CompileDate AS DataTime, CONVERT(varchar(100), quality.CompileDate, 23) AS DataTimeStr, ''/pages/info/speople_detail/main'' AS UrlStr, N'''' AS pcUrl FROM dbo.QualityAudit_EquipmentPersonQuality AS quality LEFT JOIN dbo.SitePerson_Person AS site_person ON site_person.PersonId = quality.PersonId LEFT JOIN dbo.Person_Persons AS persons ON persons.PersonId = @personId WHERE site_person.ProjectId = @projectId AND quality.AuditorId = @personId AND quality.States = ''1'' UNION ALL SELECT task.TaskId AS DataId, ''E108F75D-89D0-4DCA-8356-A156C328805C'' AS MenuId, N''培训任务'' AS MenuName, plan_info.PlanName AS Content, persons.PersonId, persons.PersonName, task.TaskDate AS DataTime, CONVERT(varchar(100), task.TaskDate, 23) AS DataTimeStr, ''/pages/train_task/task_list/main'' AS UrlStr, N'''' AS pcUrl FROM dbo.Training_Task AS task LEFT JOIN dbo.Person_Persons AS persons ON persons.PersonId = @personId LEFT JOIN dbo.Training_Plan AS plan_info ON plan_info.PlanId = task.PlanId WHERE task.ProjectId = @projectId AND (task.States IS NULL OR task.States != ''2'') AND task.UserId = @personId ORDER BY DataTime DESC; END;'; EXEC sys.sp_executesql @Sql; END; IF OBJECT_ID(N'dbo.View_APP_GetToDoItems', N'V') IS NOT NULL BEGIN SET @Sql = N' ALTER VIEW dbo.View_APP_GetToDoItems AS SELECT ProjectId, PersonId, PersonName, MenuName FROM ( SELECT plans.PlanId AS DataId, N''培训计划'' AS MenuName, persons.PersonId, persons.PersonName, plans.ProjectId FROM dbo.Training_Plan AS plans LEFT JOIN dbo.Person_Persons AS persons ON plans.DesignerId = persons.PersonId WHERE persons.PersonId IS NOT NULL AND (plans.States = ''0'' OR plans.States = ''1'') UNION ALL SELECT test_plan.TestPlanId AS DataId, N''考试计划'' AS MenuName, persons.PersonId, persons.PersonName, test_plan.ProjectId FROM dbo.Training_TestPlan AS test_plan LEFT JOIN dbo.Person_Persons AS persons ON test_plan.PlanManId = persons.PersonId WHERE persons.PersonId IS NOT NULL AND (test_plan.States = ''0'' OR test_plan.States = ''1'') UNION ALL SELECT site_person.SitePersonId AS DataId, N''现场人员'' AS MenuName, persons.PersonId, persons.PersonName, site_person.ProjectId FROM dbo.SitePerson_Person AS site_person LEFT JOIN dbo.Person_Persons AS persons ON site_person.AuditorId = persons.PersonId WHERE persons.PersonId IS NOT NULL AND site_person.States = ''0'' UNION ALL SELECT quality.PersonQualityId AS DataId, N''特种作业人员'' AS MenuName, persons.PersonId, persons.PersonName, site_person.ProjectId FROM dbo.QualityAudit_PersonQuality AS quality LEFT JOIN dbo.SitePerson_Person AS site_person ON site_person.PersonId = quality.PersonId LEFT JOIN dbo.Person_Persons AS persons ON persons.PersonId = quality.AuditorId WHERE persons.PersonId IS NOT NULL AND quality.States = ''1'' UNION ALL SELECT quality.SafePersonQualityId AS DataId, N''安管人员'' AS MenuName, persons.PersonId, persons.PersonName, site_person.ProjectId FROM dbo.QualityAudit_SafePersonQuality AS quality LEFT JOIN dbo.SitePerson_Person AS site_person ON site_person.PersonId = quality.PersonId LEFT JOIN dbo.Person_Persons AS persons ON persons.PersonId = quality.AuditorId WHERE persons.PersonId IS NOT NULL AND quality.States = ''1'' UNION ALL SELECT quality.EquipmentPersonQualityId AS DataId, N''特种设备作业人员'' AS MenuName, persons.PersonId, persons.PersonName, site_person.ProjectId FROM dbo.QualityAudit_EquipmentPersonQuality AS quality LEFT JOIN dbo.SitePerson_Person AS site_person ON site_person.PersonId = quality.PersonId LEFT JOIN dbo.Person_Persons AS persons ON persons.PersonId = quality.AuditorId WHERE persons.PersonId IS NOT NULL AND quality.States = ''1'' UNION ALL SELECT task.TaskId AS DataId, N''培训任务'' AS MenuName, persons.PersonId, persons.PersonName, task.ProjectId FROM dbo.Training_Task AS task LEFT JOIN dbo.Person_Persons AS persons ON persons.PersonId = task.UserId WHERE persons.PersonId IS NOT NULL AND (task.States IS NULL OR task.States != ''2'') ) AS V;'; EXEC sys.sp_executesql @Sql; END; /* 质量待办过程保留质量检查分支,去掉已确认删除的施工方案分支。 */ DECLARE @ProcedureName sysname; DECLARE @SolutionPosition int; DECLARE procedure_cursor CURSOR LOCAL FAST_FORWARD FOR SELECT ProcedureName FROM (VALUES (N'SpAuditingManage'), (N'SpAuditingManageByProjectId'), (N'SpNotice'), (N'SpNoticeByProjectId') ) AS names(ProcedureName) WHERE OBJECT_ID(N'dbo.' + names.ProcedureName, N'P') IS NOT NULL; OPEN procedure_cursor; FETCH NEXT FROM procedure_cursor INTO @ProcedureName; WHILE @@FETCH_STATUS = 0 BEGIN SET @ObjectDefinition = OBJECT_DEFINITION(OBJECT_ID(N'dbo.' + @ProcedureName)); IF CHARINDEX(N'Solution_CQMSConstructSolution', @ObjectDefinition) > 0 BEGIN SET @ObjectDefinition = REPLACE(@ObjectDefinition, N'CREATE PROCEDURE', N'ALTER PROCEDURE'); SET @SolutionPosition = CHARINDEX(N'Solution_CQMSConstructSolution', @ObjectDefinition); SET @StartPosition = @SolutionPosition; WHILE @StartPosition > 1 AND SUBSTRING(@ObjectDefinition, @StartPosition, 5) <> N'UNION' BEGIN SET @StartPosition = @StartPosition - 1; END; SET @EndPosition = CHARINDEX(N'UNION', @ObjectDefinition, @SolutionPosition); IF @EndPosition <= @StartPosition SET @EndPosition = CHARINDEX(N'END', @ObjectDefinition, @SolutionPosition); IF @StartPosition <= 0 OR @EndPosition <= @StartPosition THROW 50002, N'质量待办过程的施工方案分支定位失败,已停止执行。', 1; SET @ObjectDefinition = STUFF(@ObjectDefinition, @StartPosition, @EndPosition - @StartPosition, N''); EXEC sys.sp_executesql @ObjectDefinition; END; FETCH NEXT FROM procedure_cursor INTO @ProcedureName; END; CLOSE procedure_cursor; DEALLOCATE procedure_cursor; /* 删除菜单及其按钮、角色授权、流程操作残留。 */ DELETE FROM dbo.Sys_MenuFlowOperate WHERE MenuId IN (SELECT MenuId FROM @DropMenuIds); DELETE FROM dbo.Sys_ButtonToMenu WHERE MenuId IN (SELECT MenuId FROM @DropMenuIds) OR ButtonToMenuId IN (SELECT MenuId FROM @DropMenuIds); DELETE FROM dbo.Sys_ButtonPower WHERE MenuId IN (SELECT MenuId FROM @DropMenuIds) OR ButtonToMenuId IN (SELECT MenuId FROM @DropMenuIds); DELETE FROM dbo.Sys_RolePower WHERE MenuId IN (SELECT MenuId FROM @DropMenuIds); DELETE FROM dbo.Sys_Menu WHERE MenuId IN (SELECT MenuId FROM @DropMenuIds); /* 先删除旧视图和纯安全存储过程。 */ DECLARE @ViewName sysname; DECLARE view_cursor CURSOR LOCAL FAST_FORWARD FOR SELECT ViewName FROM @DropViews WHERE OBJECT_ID(N'dbo.' + ViewName, N'V') IS NOT NULL; OPEN view_cursor; FETCH NEXT FROM view_cursor INTO @ViewName; WHILE @@FETCH_STATUS = 0 BEGIN SET @Sql = N'DROP VIEW dbo.' + QUOTENAME(@ViewName) + N';'; EXEC sys.sp_executesql @Sql; FETCH NEXT FROM view_cursor INTO @ViewName; END; CLOSE view_cursor; DEALLOCATE view_cursor; DECLARE procedure_drop_cursor CURSOR LOCAL FAST_FORWARD FOR SELECT ProcedureName FROM @DropProcedures WHERE OBJECT_ID(N'dbo.' + ProcedureName, N'P') IS NOT NULL; OPEN procedure_drop_cursor; FETCH NEXT FROM procedure_drop_cursor INTO @ProcedureName; WHILE @@FETCH_STATUS = 0 BEGIN SET @Sql = N'DROP PROCEDURE dbo.' + QUOTENAME(@ProcedureName) + N';'; EXEC sys.sp_executesql @Sql; FETCH NEXT FROM procedure_drop_cursor INTO @ProcedureName; END; CLOSE procedure_drop_cursor; DEALLOCATE procedure_drop_cursor; /* 删除所有与目标表有关的外键,包括保留表指向目标表的外键。 */ DECLARE @ForeignKeyName sysname; DECLARE @ChildSchemaName sysname; DECLARE @ChildTableName sysname; DECLARE fk_cursor CURSOR LOCAL FAST_FORWARD FOR SELECT fk.name, child_schema.name, child_table.name FROM sys.foreign_keys AS fk JOIN sys.tables AS child_table ON child_table.object_id = fk.parent_object_id JOIN sys.schemas AS child_schema ON child_schema.schema_id = child_table.schema_id JOIN sys.tables AS referenced_table ON referenced_table.object_id = fk.referenced_object_id WHERE EXISTS ( SELECT 1 FROM @DropTables AS d WHERE d.TableName = child_table.name ) OR EXISTS ( SELECT 1 FROM @DropTables AS d WHERE d.TableName = referenced_table.name ); OPEN fk_cursor; FETCH NEXT FROM fk_cursor INTO @ForeignKeyName, @ChildSchemaName, @ChildTableName; WHILE @@FETCH_STATUS = 0 BEGIN SET @Sql = N'ALTER TABLE ' + QUOTENAME(@ChildSchemaName) + N'.' + QUOTENAME(@ChildTableName) + N' DROP CONSTRAINT ' + QUOTENAME(@ForeignKeyName) + N';'; EXEC sys.sp_executesql @Sql; FETCH NEXT FROM fk_cursor INTO @ForeignKeyName, @ChildSchemaName, @ChildTableName; END; CLOSE fk_cursor; DEALLOCATE fk_cursor; /* 删除目标表。 */ DECLARE @TableName sysname; DECLARE table_cursor CURSOR LOCAL FAST_FORWARD FOR SELECT TableName FROM @DropTables ORDER BY DropOrder, TableName; OPEN table_cursor; FETCH NEXT FROM table_cursor INTO @TableName; WHILE @@FETCH_STATUS = 0 BEGIN IF OBJECT_ID(N'dbo.' + @TableName, N'U') IS NOT NULL BEGIN SET @Sql = N'DROP TABLE dbo.' + QUOTENAME(@TableName) + N';'; EXEC sys.sp_executesql @Sql; END; FETCH NEXT FROM table_cursor INTO @TableName; END; CLOSE table_cursor; DEALLOCATE table_cursor; COMMIT TRANSACTION; /* 执行后核验:目标对象应为 0,保留对象仍存在。 */ SELECT d.TableName AS ObjectName, CASE WHEN OBJECT_ID(N'dbo.' + d.TableName, N'U') IS NULL THEN 0 ELSE 1 END AS ExistsFlag FROM @DropTables AS d ORDER BY d.TableName; SELECT v.ViewName AS ObjectName, CASE WHEN OBJECT_ID(N'dbo.' + v.ViewName, N'V') IS NULL THEN 0 ELSE 1 END AS ExistsFlag FROM @DropViews AS v ORDER BY v.ViewName; SELECT p.ProcedureName AS ObjectName, CASE WHEN OBJECT_ID(N'dbo.' + p.ProcedureName, N'P') IS NULL THEN 0 ELSE 1 END AS ExistsFlag FROM @DropProcedures AS p ORDER BY p.ProcedureName; SELECT N'DroppedMenuRows' AS Metric, COUNT_BIG(*) AS Value FROM @DropMenuIds; SELECT N'Retained_SitePerson_Person' AS ObjectName, CASE WHEN OBJECT_ID(N'dbo.SitePerson_Person', N'U') IS NULL THEN 0 ELSE 1 END AS ExistsFlag UNION ALL SELECT N'Retained_Person_Persons', CASE WHEN OBJECT_ID(N'dbo.Person_Persons', N'U') IS NULL THEN 0 ELSE 1 END UNION ALL SELECT N'Retained_Training_Plan', CASE WHEN OBJECT_ID(N'dbo.Training_Plan', N'U') IS NULL THEN 0 ELSE 1 END UNION ALL SELECT N'Retained_Training_TestRecord', CASE WHEN OBJECT_ID(N'dbo.Training_TestRecord', N'U') IS NULL THEN 0 ELSE 1 END UNION ALL SELECT N'Retained_WBS_UnitWork', CASE WHEN OBJECT_ID(N'dbo.WBS_UnitWork', N'U') IS NULL THEN 0 ELSE 1 END UNION ALL SELECT N'Retained_HJGL_WeldingDaily', CASE WHEN OBJECT_ID(N'dbo.HJGL_WeldingDaily', N'U') IS NULL THEN 0 ELSE 1 END UNION ALL SELECT N'Retained_QualityAudit_PersonQuality', CASE WHEN OBJECT_ID(N'dbo.QualityAudit_PersonQuality', N'U') IS NULL THEN 0 ELSE 1 END; SELECT N'View_APP_GetToDoItems_TargetReferenceCount' AS Metric, COUNT(*) AS Value FROM sys.sql_expression_dependencies AS d WHERE d.referencing_id = OBJECT_ID(N'dbo.View_APP_GetToDoItems') AND d.referenced_entity_name IN ( SELECT TableName FROM @DropTables UNION ALL SELECT ViewName FROM @DropViews ); SELECT N'Sp_APP_GetToDoItems_TargetReferenceCount' AS Metric, COUNT(*) AS Value FROM sys.sql_expression_dependencies AS d WHERE d.referencing_id = OBJECT_ID(N'dbo.Sp_APP_GetToDoItems') AND d.referenced_entity_name IN ( SELECT TableName FROM @DropTables UNION ALL SELECT ViewName FROM @DropViews ); END TRY BEGIN CATCH IF XACT_STATE() <> 0 ROLLBACK TRANSACTION; THROW; END CATCH;