/* 04.11.2024, TSC */ /* 01.11.2024, TSC */ USE [HCITools] GO /****** Object: StoredProcedure [dbo].[phidx_mask_service_providers] Script Date: 01.11.2024 14:47:24 ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO /* TPDT-742 Anonymizing pharmindex service providers https://galenica.atlassian.net/wiki/spaces/OCART/pages/1202389081/Pharmindex+service+providers+masking Will alter every retired or deleted service providers to mask their name, address, phone, fax and email in the pharmindexTP of a central that is either n+1 n+2 888 27.09.2024, TSC Creation 04.11.2024, TSC When cleaning Arizona, ignoring service providers linked to a Organizational Unit. */ CREATE OR ALTER PROCEDURE [dbo].[phidx_mask_service_providers] @force BIT = 0 AS BEGIN SET XACT_ABORT ON; SET NOCOUNT ON; IF NOT EXISTS( SELECT 1 FROM [sys].[databases] [d] WHERE [d].[name] = 'pharmindexTP' ) AND @force = 0 BEGIN PRINT 'No pharmindexTP database on this instance, exiting.'; RETURN 0; END IF NOT EXISTS( SELECT 1 FROM [master].[cfg].[InstanceContext] WHERE [Business] IN ('TPCENT') ) AND @force = 0 BEGIN PRINT 'This instance is not a central, exiting.'; RETURN 0; END IF NOT EXISTS ( SELECT 1 FROM [master].[cfg].[InstanceContext] WHERE [Type] IN ('DEVE', 'VALI') ) AND @force = 0 BEGIN PRINT 'Non dev environment, exiting.'; RETURN 0; END IF OBJECT_ID('tempdb..#sp') IS NOT NULL BEGIN DROP TABLE [#sp]; END CREATE TABLE [#sp] ( [ServiceProviderId] INT NOT NULL ); --fetch the id's of the data to mask INSERT INTO [#sp] ([ServiceProviderId]) SELECT [sp].[ServiceProviderId] FROM [PharmIndexTP].[dbo].[ServiceProvider] [sp] WHERE ([sp].[Status] = 'R' OR [sp].[Deleted] = 1) AND [sp].[Name1] <> 'Masked' AND [sp].[Name2] NOT LIKE 'Provider%'; PRINT CONVERT(VARCHAR(20), CURRENT_TIMESTAMP, 114) + ' - collected SP to mask. ' + REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, @@ROWCOUNT), 1), ',', ''''), '.00', '') + ' row(s) affected.'; --rename service providers UPDATE [sp] SET [sp].[Name1] = 'Masked', [sp].[Name2] = 'Provider ' + CAST([sp].[ServiceProviderId] AS VARCHAR(15)), [sp].[Title] = NULL, [sp].[Sex] = NULL FROM [#sp] [s] JOIN [PharmIndexTP].[dbo].[ServiceProvider] [sp] ON [s].[ServiceProviderId] = [sp].[ServiceProviderId]; PRINT CONVERT(VARCHAR(20), CURRENT_TIMESTAMP, 114) + ' - renamed SP. ' + REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, @@ROWCOUNT), 1), ',', ''''), '.00', '') + ' row(s) affected.'; --alter sp address UPDATE [sa] SET [sa].[State] = 'BE', [sa].[ZIP] = 3011, [sa].[City] = 'Bern', [sa].[Address] = 'Bundesplatz', [sa].[AddressNumber] = 3 FROM [#sp] [s] JOIN [PharmIndexTP].[dbo].[ServiceProviderAddress] [sa] ON [s].[ServiceProviderId] = [sa].[ServiceProviderId]; PRINT CONVERT(VARCHAR(20), CURRENT_TIMESTAMP, 114) + ' - altered address. ' + REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, @@ROWCOUNT), 1), ',', ''''), '.00', '') + ' row(s) affected.'; --clean communications (ServiceProviderCommunication and ServiceProviderCommunication2) DELETE [sc2] FROM [#sp] [s] JOIN [PharmIndexTP].[dbo].[ServiceProviderAddress] [sa] ON [s].[ServiceProviderId] = [sa].[ServiceProviderId] JOIN [PharmIndexTP].[dbo].[ServiceProviderCommunication2] [sc2] ON [sc2].[ServiceProviderAddressId] = [sa].[ServiceProviderAddressId]; PRINT CONVERT(VARCHAR(20), CURRENT_TIMESTAMP, 114) + ' - cleaned communication2. ' + REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, @@ROWCOUNT), 1), ',', ''''), '.00', '') + ' row(s) affected.'; DELETE [sc] FROM [#sp] [s] JOIN [PharmIndexTP].[dbo].[ServiceProviderAddress] [sa] ON [s].[ServiceProviderId] = [sa].[ServiceProviderId] JOIN [PharmIndexTP].[dbo].[ServiceProviderCommunication] [sc] ON [s].[ServiceProviderId] = [sc].[ServiceProviderId]; PRINT CONVERT(VARCHAR(20), CURRENT_TIMESTAMP, 114) + ' - cleared communication. ' + REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, @@ROWCOUNT), 1), ',', ''''), '.00', '') + ' row(s) affected.'; --clean emails (ServiceProviderECommunication and ServiceProviderECommunication2) DELETE [sc2] FROM [#sp] [s] JOIN [PharmIndexTP].[dbo].[ServiceProviderAddress] [sa] ON [s].[ServiceProviderId] = [sa].[ServiceProviderId] JOIN [PharmIndexTP].[dbo].[ServiceProviderECommunication2] [sc2] ON [sc2].[ServiceProviderAddressId] = [sa].[ServiceProviderAddressId]; PRINT CONVERT(VARCHAR(20), CURRENT_TIMESTAMP, 114) + ' - cleaned ecommunication2. ' + REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, @@ROWCOUNT), 1), ',', ''''), '.00', '') + ' row(s) affected.'; DELETE [sc] FROM [#sp] [s] JOIN [PharmIndexTP].[dbo].[ServiceProviderAddress] [sa] ON [s].[ServiceProviderId] = [sa].[ServiceProviderId] JOIN [PharmIndexTP].[dbo].[ServiceProviderECommunication] [sc] ON [s].[ServiceProviderId] = [sc].[ServiceProviderId]; PRINT CONVERT(VARCHAR(20), CURRENT_TIMESTAMP, 114) + ' - cleaned ecommunication. ' + REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, @@ROWCOUNT), 1), ',', ''''), '.00', '') + ' row(s) affected.'; --insert fake emails in [ServiceProviderECommunication] INSERT INTO [PharmIndexTP].[dbo].[ServiceProviderECommunication] ([ServiceProviderId], [Category], [Type], [Value], [CreationDate], [UpdateDate]) SELECT [sp].[ServiceProviderId], 'B' AS [category], 'MAIL' AS [Type], 'masked_provider_' + CAST([sp].[ServiceProviderId] AS VARCHAR(15)) + '@nomail.com' AS [Value], CURRENT_TIMESTAMP AS [CreationDate], CURRENT_TIMESTAMP AS [UpdateDate] FROM [#sp] [s] JOIN [PharmIndexTP].[dbo].[ServiceProvider] [sp] ON [s].[ServiceProviderId] = [sp].[ServiceProviderId]; PRINT CONVERT(VARCHAR(20), CURRENT_TIMESTAMP, 114) + ' - inserted fake emails in ecommunication. ' + REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, @@ROWCOUNT), 1), ',', ''''), '.00', '') + ' row(s) affected.'; --insert fake emails in [ServiceProviderECommunication2] INSERT INTO [PharmIndexTP].[dbo].[ServiceProviderECommunication2] ([ServiceProviderAddressId], [Category], [Type], [Value], [CreationDate], [UpdateDate]) SELECT [sa].[ServiceProviderAddressId], 'B' AS [category], 'MAIL' AS [Type], 'masked_provider_' + CAST([s].[ServiceProviderId] AS VARCHAR(15)) + '@nomail.com' AS [Value], CURRENT_TIMESTAMP AS [CreationDate], CURRENT_TIMESTAMP AS [UpdateDate] FROM [#sp] [s] JOIN [PharmIndexTP].[dbo].[ServiceProviderAddress] [sa] ON [s].[ServiceProviderId] = [sa].[ServiceProviderId]; PRINT CONVERT(VARCHAR(20), CURRENT_TIMESTAMP, 114) + ' - inserted fake emails in ecommunication2. ' + REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, @@ROWCOUNT), 1), ',', ''''), '.00', '') + ' row(s) affected.'; --initial cleanup of arizona data not present in pharmindex anymore IF OBJECT_ID('tempdb..#cleanup') IS NOT NULL BEGIN DROP TABLE [#cleanup]; END CREATE TABLE [#cleanup] ( [Address_ID] INT NOT NULL ); INSERT INTO [#cleanup]([Address_ID]) SELECT [ad].[Address_ID] FROM [Arizona].[dbo].[address] [ad] JOIN [Arizona].[dbo].[PH_prescriber] [sp] ON [ad].[Address_ID] = [sp].[PHPR_address] WHERE [sp].[PHPR_status] = 2 AND NOT EXISTS( --ignore SP linked to OU SELECT 1 FROM [Arizona].[dbo].[Organizational_unit] ou WHERE [ou].[OU_address] = [ad].[Address_ID] ) AND ( ISNULL([ad].[AD_first_name], '') <> 'Masked' AND ISNULL([ad].[AD_last_name], '') NOT LIKE 'Provider%' ); PRINT CONVERT(VARCHAR(20), CURRENT_TIMESTAMP, 114) + ' - fetched arizona ph_prescriber in status 2. ' + REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, @@ROWCOUNT), 1), ',', ''''), '.00', '') + ' row(s) affected.'; --mask address UPDATE [ad] SET [ad].[AD_first_name] = LEFT('Masked', 30), [ad].[AD_last_name] = LEFT('Provider ' + CAST([ad].[Address_ID] AS VARCHAR(10)), 30), [ad].[AD_middle_name] = NULL, [ad].[AD_name] = LEFT('Masked Provider ' + CAST([ad].[Address_ID] AS VARCHAR(10)), 60), [ad].[AD_title] = NULL, [ad].[AD_sex] = CASE WHEN [ad].[Address_ID] % 2 = 0 THEN 1 ELSE 2 END, [ad].[AD_address_1] = 'Bundesplatz 3', [ad].[AD_address_2] = NULL, [ad].[AD_address_3] = NULL, [ad].[AD_address_supplement] = NULL, [ad].[AD_zip_code] = '3011', [ad].[AD_city] = 'Bern', [ad].[AD_state] = 'BE', [ad].[AD_postal_routing_address] = '3011 Bern', [ad].[AD_language] = 1, [ad].[AD_country] = 1 FROM [Arizona].[dbo].[address] [ad] JOIN [#cleanup] [c] ON [c].[Address_ID] = [ad].[Address_ID]; PRINT CONVERT(VARCHAR(20), CURRENT_TIMESTAMP, 114) + ' - masked arizona.address. ' + REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, @@ROWCOUNT), 1), ',', ''''), '.00', '') + ' row(s) affected.'; --mask address_key type 5 UPDATE [adk] SET [adk].[ADK_key] = LEFT([ad].[AD_name], 15) FROM [Arizona].[dbo].[address_key] [adk] JOIN [#cleanup] [c] ON [c].[Address_ID] = [adk].[ADK_address] JOIN [Arizona].[dbo].[address] [ad] ON [ad].[Address_ID] = [c].[Address_ID] WHERE [adk].[ADK_type] = 5; PRINT CONVERT(VARCHAR(20), CURRENT_TIMESTAMP, 114) + ' - masked arizona.address_key type 5. ' + REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, @@ROWCOUNT), 1), ',', ''''), '.00', '') + ' row(s) affected.'; END GO /* Drop existing standard schedule for job */ declare @schedule_id int declare c_schedules cursor local forward_only static for select ss.schedule_id from msdb.dbo.sysjobschedules sjs INNER JOIN msdb.dbo.sysschedules ss ON sjs.schedule_id = ss.schedule_id AND ss.name NOT LIKE '%#SPEC#' INNER JOIN msdb.dbo.sysjobs sj ON sjs.job_id = sj.job_id WHERE sj.name = N'_D03091 - INDEX - Load items CDS and prescribers from PharmIndex to Arizona - Central' open c_schedules FETCH NEXT FROM c_schedules into @schedule_id while @@fetch_status = 0 begin IF ((select COUNT(*) from msdb.dbo.sysjobschedules where schedule_id=@schedule_id) = 1) EXEC msdb.dbo.sp_delete_schedule @schedule_id=@schedule_id, @force_delete = 1 FETCH NEXT FROM c_schedules into @schedule_id end close c_schedules deallocate c_schedules IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'_D03091 - INDEX - Load items CDS and prescribers from PharmIndex to Arizona - Central') EXEC msdb.dbo.sp_delete_job @job_name = N'_D03091 - INDEX - Load items CDS and prescribers from PharmIndex to Arizona - Central', @delete_unused_schedule=0 GO /* Creation Job and Steps*/ BEGIN TRANSACTION DECLARE @ReturnCode INT SELECT @ReturnCode = 0 IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'TPH-Business' AND category_class=1) BEGIN EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'TPH-Business' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback END /* Add Job */ DECLARE @jobId BINARY(16) EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'_D03091 - INDEX - Load items CDS and prescribers from PharmIndex to Arizona - Central', @enabled=1, @notify_level_eventlog=0, @notify_level_email=0, @notify_level_netsend=0, @notify_level_page=0, @delete_level=0, @description=N'Load items, CDS and prescribers from PharmIndex to Arizona 2017.01.18 SNU/GBA : insert new step 7 for br 20170515 TTP Add step "INDEX - Control if ..." 20181029 GBA D 20200408 SPE Add step Update PEXF 20220317 FLA Change DBA mail 20220330 RTC Update ph_prescriber status 20220429 FLA Remove ph_prescriber status 20230713 FLA Change mailing list in steps, 20230818 SNU Remove step Control if ... 20241030 TSC TPDT-742 Added pharmindexTP service provider masking', @category_name=N'TPH-Business', @start_step_id=1, @owner_login_name=N'sa', @job_id = @jobId OUTPUT IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback /* Add Step */ EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Empty step', @step_id=1, @cmdexec_success_code=0, @on_success_action=3, @on_success_step_id=0, @on_fail_action=3, @on_fail_step_id=0, @retry_attempts=0, @retry_interval=0, @os_run_priority=0, @subsystem=N'TSQL', @command=N'/* Empty step */ ', @database_name=N'master', @output_file_name=NULL, @flags=0, @database_user_name=NULL, @server=NULL, @additional_parameters=NULL, @proxy_id=NULL, @proxy_name=NULL IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback /* Add Step */ EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'Check state of Pharmindex download', @step_id=2, @cmdexec_success_code=0, @on_success_action=3, @on_success_step_id=0, @on_fail_action=4, @on_fail_step_id=7, @retry_attempts=0, @retry_interval=0, @os_run_priority=0, @subsystem=N'TSQL', @command=N' /* Check download from Pharmindex is finished */ declare @today datetime; select @today = convert(datetime, convert(varchar(20), getdate(),102)) if not exists ( select top 1 * from BatchImportHistory bih where bih.Success = 1 and bih.EndImportDate > @today) begin /* Download not OK */ raiserror(''Pharmindex download in process, job not executed'', 16,1) end; ', @database_name=N'PharmIndexTP', @output_file_name=NULL, @flags=0, @database_user_name=NULL, @server=NULL, @additional_parameters=NULL, @proxy_id=NULL, @proxy_name=NULL IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback /* Add Step */ EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'mask pharmindex service providers', @step_id=3, @cmdexec_success_code=0, @on_success_action=3, @on_success_step_id=0, @on_fail_action=4, @on_fail_step_id=7, @retry_attempts=0, @retry_interval=0, @os_run_priority=0, @subsystem=N'TSQL', @command=N'exec [dbo].[phidx_mask_service_providers]', @database_name=N'HCITools', @output_file_name=NULL, @flags=0, @database_user_name=NULL, @server=NULL, @additional_parameters=NULL, @proxy_id=NULL, @proxy_name=NULL IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback /* Add Step */ EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'INDEX - Transfert PharmIndexTP to Arizona items, Prescriber using Checksum', @step_id=4, @cmdexec_success_code=0, @on_success_action=3, @on_success_step_id=0, @on_fail_action=4, @on_fail_step_id=7, @retry_attempts=0, @retry_interval=0, @os_run_priority=0, @subsystem=N'TSQL', @command=N' begin try declare @out_param_int_1 int execute[dbo].[pdx_loading] @in_job_type = 20 ,@skip_mapping = 0 ,@in_subsidiary = 100 ,@in_table_name = null ,@in_debug = 0 ,@out_param_int_1 = @out_param_int_1 output end try begin catch declare @mail_message nvarchar(2000), @mail_subject nvarchar(255); set @mail_message = ''
Résumé des erreurs dans le tableau ci-dessous :
'' +''| ErrorNumber | ErrorSeverity | ErrorState | ErrorProcedure | ErrorLine | ErrorMessage |
|---|---|---|---|---|---|
| '' + isnull(convert(varchar, ERROR_NUMBER()), '''') + '' | '' + isnull(convert(varchar, ERROR_SEVERITY()), '''') + '' | '' + isnull(convert(varchar, ERROR_STATE()), '''') + '' | '' + isnull(ERROR_PROCEDURE(), '''') + '' | '' + isnull(convert(varchar, ERROR_LINE()), '''') + '' | '' + isnull(ERROR_MESSAGE(), '''') + '' |