Files
SGGL_SHJ/SGGL/Database/20260917_HSSE_PersonOnly_Cleanup.sql
T

804 lines
32 KiB
Transact-SQL
Raw Normal View History

/*
陕化建施工管理系统安全管理收口清理脚本
目标库: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;