From 5a4f2784bb7f8c0b3ac1b5a49a375962932dbedb Mon Sep 17 00:00:00 2001 From: "Schork Thierry (Galenica)" Date: Tue, 13 Jan 2026 08:14:13 +0100 Subject: [PATCH] sync --- ...ress_Authorization_Granted replacement.sql | 132 +++ ADR REPO - heap table rebuild.sql | 30 + ADR REPO - index changes.sql | 123 +++ ADR REPO - script to integrate.sql | 90 ++ ...ress_Authorization_Granted replacement.sql | 49 + CRS dev - bkp restore data with bcp.sql | 61 ++ CRS dev - create needed structure in dbo.sql | 672 ++++++++++++++ DEV - Script a job and shcedules.sql | 338 +++++++ ...rants and roles for all logins in a db.sql | 119 +-- EXPLOIT - check log backup size.sql | 17 + ...rt replication agents that are stopped.sql | 1 - check disk usage and db size.sql | 134 +++ craft xml rdcman.sql | 82 ++ craft xml replication monitor.sql | 2 +- delphix.create_delphix_d.sql | 222 +++++ gaia - create linked server to hyperscale.sql | 43 + ...cture for consolidated change tracking.sql | 88 ++ phidx masking central rollback.sql | 39 + phidx masking package.sql | 841 ++++++++++++++++++ query store search.sql | 42 + repl.sql | 25 +- sqlLogin-db-pipeline creation and setup.sql | 79 ++ todo clean masking.sql | 402 +++++++++ 23 files changed, 3503 insertions(+), 128 deletions(-) create mode 100644 ADR REPO - aps_fn_Is_Address_Authorization_Granted replacement.sql create mode 100644 ADR REPO - heap table rebuild.sql create mode 100644 ADR REPO - index changes.sql create mode 100644 ADR REPO - script to integrate.sql create mode 100644 ADR REPO - simplest aps_fn_Is_Address_Authorization_Granted replacement.sql create mode 100644 CRS dev - bkp restore data with bcp.sql create mode 100644 CRS dev - create needed structure in dbo.sql create mode 100644 DEV - Script a job and shcedules.sql create mode 100644 EXPLOIT - check log backup size.sql create mode 100644 check disk usage and db size.sql create mode 100644 craft xml rdcman.sql create mode 100644 delphix.create_delphix_d.sql create mode 100644 gaia - create linked server to hyperscale.sql create mode 100644 gaia - create structure for consolidated change tracking.sql create mode 100644 phidx masking central rollback.sql create mode 100644 phidx masking package.sql create mode 100644 query store search.sql create mode 100644 sqlLogin-db-pipeline creation and setup.sql create mode 100644 todo clean masking.sql diff --git a/ADR REPO - aps_fn_Is_Address_Authorization_Granted replacement.sql b/ADR REPO - aps_fn_Is_Address_Authorization_Granted replacement.sql new file mode 100644 index 0000000..d771995 --- /dev/null +++ b/ADR REPO - aps_fn_Is_Address_Authorization_Granted replacement.sql @@ -0,0 +1,132 @@ +USE [ArizonaREP]; +GO + +--#region fn_StringSplit() +CREATE OR ALTER FUNCTION [dbo].[fnSplitString] ( + @string NVARCHAR(MAX), + @delimiter CHAR(1) +) +RETURNS @output TABLE ( + [value] NVARCHAR(MAX) +) +BEGIN + DECLARE @start INT, + @end INT; + SELECT @start = 1, + @end = CHARINDEX(@delimiter, @string); + WHILE @start < LEN(@string) + 1 + BEGIN + IF @end = 0 + SET @end = LEN(@string) + 1; + + INSERT INTO @output ( + [value] + ) + VALUES ( + SUBSTRING(@string, @start, @end - @start) + ); + SET @start = @end + 1; + SET @end = CHARINDEX(@delimiter, @string, @start); + + END; + RETURN; +END; +--#endregion fn_StringSplit() +GO +/* +--generate test string with 100 guid +SELECT + STRING_AGG([x].[address_guid], ',') adr_guids +FROM ( + SELECT TOP (100) + CAST(ad.Address_GUID AS VARCHAR(MAX)) AS address_guid + --ad.AD_master_address as t_ADH_master_address + FROM [dbo].[Address] AS [ad] + ORDER BY NEWID() +)x +*/ +DECLARE @input VARCHAR(MAX) + = 'C73898FF-5503-4565-BF1B-0EB6B9C931C3,7827AE66-6A0A-4CC9-A285-EF9269FC720D,3568B542-C543-4392-A370-88C9CD64F8C8,665A9FF2-2C31-4CFF-B341-6B657AAAB801,1B839554-509A-4CFC-802A-24F3094615D7,A8F72DC3-3398-47FE-80FD-31B316B4963D,A40AAEB1-1EDB-445F-B5E6-34BBED9640D8,E51A1139-9B7A-422F-8B54-ECB505DDB8E3,5B59C63B-6F9F-4C27-B29E-FFE75E952249,36C6EB7C-9E6E-40BC-8F95-FAB7C24667A0,3F358729-17EA-46F5-89F8-3D479025B9F9,BDF0B7BA-B6AD-4C85-9D61-C0BCFAC583AA,51F2424E-F612-4C2B-8BC5-9CB4A99F5A46,2CF05930-C477-44F9-9595-4B78F696CFFD,04CDF0CC-0241-41EC-969F-FA0749794F46,72433873-0DC5-46D0-9C06-BD568D31C7AE,8EC41453-AB8D-4F16-859B-E2EDBD2DBB2F,C390DC70-26FC-46E7-9080-45C9BE1D6889,E0BD4EAF-4CC0-42D1-ADAB-4D7471A68283,B118BE7E-563D-4316-B7CC-1F01CEE3B039,C9B34504-166C-48C4-822D-617C51220748,F586CCCA-23A2-40A0-84B7-436779762DC4,2D0C6359-A098-428E-A6AE-DBBBABF043AE,9A619595-02B6-44A6-B82B-F679D8724874,DDDE8312-124C-4B58-904E-5048A04ED389,37EF5C4A-EA7D-4EBA-8953-95658CFF0BA5,BD035A75-BE42-43E7-A9AC-23F33A81A5C5,635B9C48-38B7-405F-89CF-09F1327D4071,C325545D-2B8C-4CB7-A41D-B0CB421EE844,09A57484-66B9-43CA-B9D3-3E4ED363C730,048DD6ED-1D33-4741-AF28-897B6FBE27ED,7E8488A5-A56F-47D8-B393-7A0B43776A68,5E2DA8D5-36DD-4F07-8C16-3DFF1D21F023,B5E69008-2989-4CFA-86D4-946E591170D8,DC613FD4-A0AA-4D17-ADDF-7D26F3EEAC4F,CA0B8803-EFE4-44C9-A664-5B4123EAE7EE,8CF9A86D-E257-4213-B82E-A6AFB42C5E0B,D76A5BC9-6F5C-4124-A3FF-055128763D43,72440A44-6567-4695-910F-3D0977E114E9,E78B77D9-9CC3-417B-8E79-FB35324EB2D6,F19D17F5-F5ED-4A12-BC03-3A319CA8B8E2,2B00E466-CEA3-4AC6-BF69-E46534E8CE52,798D1622-811E-436E-BDB5-38635507BDC0,029E540F-8143-49A5-A047-7E623B387730,4367A715-5BFB-4239-B64E-D14EA6206130,15AFCAB3-AB1A-44B8-8772-A70B117339CE,04FF167C-6FE9-41D7-9015-50AD4BE27FF4,7CB284A9-F767-41F6-9AEC-3FC94FAE1EB4,F94A54D5-7DF0-43EA-A060-470CA7F3EFAC,68D94F61-6F14-4961-9A6F-4B8DBAE59799,C64326DA-EDF8-4FF9-8CE0-F0E380A28A1C,697E54FB-8D7B-4555-AF4F-38443078A01D,198B8239-D9F0-4148-A33F-C472BD3791AF,C7747A95-0CB0-4507-A35E-3C90C4DCA928,CEE05E37-705E-4BEE-BD9D-64CA38B8CC41,58B7055E-446C-4418-8917-CE2F3F286977,1A45D7AF-5CB5-420B-97E2-65831FB0B1FE,E4347572-64D3-484F-85EE-903D7DA8E58B,1C5B9754-14CD-4C81-AE75-FD095F089564,7DDC7190-7B92-427A-87C4-8E4B47348236,5BC2E239-C984-4D93-BEDE-1AEA1AD75016,81CDA684-3B50-4B09-A982-84F7F9640B18,2BF35438-E23F-4288-B187-237E6B9A8557,0F3EA17E-F334-4A3B-A8D4-8DC0FF91BCE2,A89197EB-013D-4A2D-898F-AE79191799C7,0BBBCD77-3333-4FF8-B06E-2547D6EC1FAD,0B4E5C88-3AB3-4925-9551-89602C024E0E,4ADAA89F-0409-459E-AE07-0A675BE9426D,8C5340AC-4119-47C0-B06F-F03A52B1B6BF,6EC0ED06-AE8A-4144-A638-1D19CB796EC0,832DC701-F925-47D3-8E64-A068EE6C36AB,39904FFA-ACA7-4E30-A68B-06C4416D3888,6736CE51-FF16-4C23-ABCB-BB85096A08B7,E158BEAB-7D32-4242-BCC9-3EE3E357CF4F,1042E15B-9E87-4F92-AB31-54FA46643F2C,C1ADDF37-C581-473E-B757-37C7F6E85A77,2D93F824-FEE3-4175-9F40-02846EBCCA0E,FB1B5495-6E45-4D3B-8FAC-98CAD37718FF,D27F9EF5-5D45-4A16-82BC-99DA574286EA,B79AE10A-0CB5-4CBA-BB18-2DE32C43077B,3EB0947C-2CF7-4272-B46A-00CB35ECFF9D,069D4B6B-D356-47D3-9FF3-ECC53BD6CC62,D7E8F35B-A2E7-4562-9F4F-0119EB068FBD,D429C601-EE85-440F-AC66-11BAACC11F69,5F6978C3-C8F0-46AA-9222-74746E103458,09611BCB-26D6-4D9D-972E-08759AF0DA30,7CF6034E-E4E3-4E82-AA27-185972146F41,52DECBE0-78DC-4393-9C09-069FD324165F,052A31BB-2E57-480A-BF49-1524631114E6,8B03ADF6-BBC8-49E9-9B15-AAFD915ADD83,B7C190CA-12B1-4B7B-9EBF-D9D208CF364C,82855646-59C3-461E-8BBF-CEDBE0EA235C,94C980B9-FC43-4EC2-BF7C-77C00AD44CE1,51AB8015-B7BA-44DB-888B-F75D797B03EB,87696D53-AE00-40B6-897A-0B9E89119A97,4BEF71D1-BD1A-4F39-8C13-31DCC56FC51F,96DC1B07-ABA3-4560-B844-D76FFAD70DFB,EB435CF7-B5E3-4A5F-A348-B8F0E06FDC9D,D0A09608-F66C-43F9-AF8A-75AEEE27358A,9E9D0D81-4733-4E98-AE0D-B5D3D62ECE17,173DB54C-9615-418F-AC50-236733BF1A5E'; + +--SET @input = 'C73898FF-5503-4565-BF1B-0EB6B9C931C3' +SET @input ='069D4B6B-D356-47D3-9FF3-ECC53BD6CC62' + +--CREATE OR ALTER PROCEDURE dbo.aps_get_address_authorization_granted_bulk +-- @addresse_guid_list varchar(max) +-- AS BEGIN +;WITH [cteValues] AS ( + --transform input values in a table + SELECT [value] AS [address_guid] + FROM [dbo].fnSplitString(@input, ',') +), + [cteMaster] AS ( + --resolve master address + SELECT [cv].[address_guid] AS [t_ADH_address_GUID], + COALESCE([a].[AD_top_master_address], [a].[Address_GUID]) AS [t_ADH_master_address] + FROM [cteValues] AS [cv] + JOIN [dbo].[Address] AS [a] ON [a].[Address_GUID] = [cv].[address_guid] +), + [cteChildren] AS ( + --fetch all addresses using the same master_address + SELECT [v].[t_ADH_address_GUID] AS [requested_adr_guid], --keep the original guid given in input along with all the adr_guid of entries in the branch + [ad].[Address_GUID] AS [t_ADH_address_GUID], + [ad].[AD_master_address] AS [t_ADH_master_address] + FROM [cteMaster] AS [v] (NOLOCK) + JOIN [dbo].[Address] AS [ad] WITH (NOLOCK) ON [ad].[AD_top_master_address] = [v].[t_ADH_master_address] + UNION + SELECT [cv].[address_guid] AS [requested_adr_guid], + [dbo].[aps_fn_Get_Master_Address]([cv].[address_guid]) AS [t_ADH_address_GUID], + NULL AS [t_ADH_master_address] + FROM [cteValues] AS [cv] +), + cteLastStatus AS ( + SELECT ROW_NUMBER()OVER(PARTITION BY ch.[t_ADH_address_GUID] ORDER BY [ash].[AUSH_value_date] DESC) AS rnk + ,[ash].[AUSH_status] + ,ch.[t_ADH_address_GUID] + ,ch.[requested_adr_guid] + FROM [cteChildren] ch + JOIN dbo.[Aps_authorization] AS [aa] ON aa.[APSAU_master_address] = ch.[t_ADH_address_GUID] + JOIN [dbo].[Authorization_status_history] AS [ash] ON ash.[AUSH_APS_authorization] = aa.[Aps_authorization_GUID] + ) +, + [cteStatus] AS ( + --fetch current status for each master address + SELECT COALESCE([dbo].[aps_fn_Get_Authorization_Last_Status]([apsau].[Aps_authorization_GUID], 1), 0) AS [lastStatus], + [m].[t_ADH_master_address], + [m].[t_ADH_address_GUID], + [m].[requested_adr_guid] + --FROM [cteMaster] AS [m] + FROM [cteChildren] AS [m] + LEFT JOIN [dbo].[Aps_authorization] AS [apsau] (NOLOCK) ON [apsau].[APSAU_master_address] = [m].[t_ADH_master_address] + AND [apsau].[APSAU_type] = 1 +), + [cteResult] AS ( + --filter the status following rules in aps_fn_Is_Address_Authorization_Granted + SELECT [cs].[requested_adr_guid], + CAST(CASE + WHEN MIN(COALESCE([cs].[lastStatus], 0)) NOT IN ( 2, 3 ) THEN + 0 + ELSE + 1 + END AS BIT) AS [isGranted] + , dbo.[aps_fn_Is_Address_Authorization_Granted](cs.[requested_adr_guid],1,null) AS isGranted_original + FROM [cteStatus] AS [cs] + WHERE [cs].[lastStatus] <> 1 --ignore pending requests + GROUP BY [cs].[requested_adr_guid] +) + +--SELECT [cteResult].[t_ADH_address_GUID], +-- [cteResult].[isGranted] +--FROM [cteResult]; +--SELECT * +--FROM [cteResult] +--ORDER BY [cteResult].[requested_adr_guid]; + + +--SELECT +-- v.[address_guid] +-- , dbo.[aps_fn_Is_Address_Authorization_Granted](v.[address_guid],1,null) AS isGranted +--FROM [cteValues] v + +SELECT * +FROM [cteChildren] \ No newline at end of file diff --git a/ADR REPO - heap table rebuild.sql b/ADR REPO - heap table rebuild.sql new file mode 100644 index 0000000..a19f12c --- /dev/null +++ b/ADR REPO - heap table rebuild.sql @@ -0,0 +1,30 @@ +USE [ArizonaRep] + +PRINT CONVERT(VARCHAR(20), CURRENT_TIMESTAMP, 114)+' - starting address. '+REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, @@rowcount), 1),',',''''),'.00','')+' row(s) affected.'; +ALTER TABLE dbo.address +REBUILD WITH( + FILLFACTOR = 70 +) +PRINT CONVERT(VARCHAR(20), CURRENT_TIMESTAMP, 114)+' - done address . '+REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, @@rowcount), 1),',',''''),'.00','')+' row(s) affected.'; + +PRINT CONVERT(VARCHAR(20), CURRENT_TIMESTAMP, 114)+' - starting Address_key. '+REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, @@rowcount), 1),',',''''),'.00','')+' row(s) affected.'; +ALTER TABLE dbo.Address_key +REBUILD WITH( + FILLFACTOR = 70 +) +PRINT CONVERT(VARCHAR(20), CURRENT_TIMESTAMP, 114)+' - done Address_key. '+REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, @@rowcount), 1),',',''''),'.00','')+' row(s) affected.'; + +PRINT CONVERT(VARCHAR(20), CURRENT_TIMESTAMP, 114)+' - starting Address_OU_link. '+REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, @@rowcount), 1),',',''''),'.00','')+' row(s) affected.'; +ALTER TABLE dbo.Address_OU_link +REBUILD WITH( + FILLFACTOR = 70 +) +PRINT CONVERT(VARCHAR(20), CURRENT_TIMESTAMP, 114)+' - done Address_OU_link. '+REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, @@rowcount), 1),',',''''),'.00','')+' row(s) affected.'; + +PRINT CONVERT(VARCHAR(20), CURRENT_TIMESTAMP, 114)+' - starting telecom. '+REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, @@rowcount), 1),',',''''),'.00','')+' row(s) affected.'; +ALTER TABLE dbo.telecom +REBUILD WITH( + FILLFACTOR = 70 +) +PRINT CONVERT(VARCHAR(20), CURRENT_TIMESTAMP, 114)+' - done telecom. '+REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, @@rowcount), 1),',',''''),'.00','')+' row(s) affected.'; + diff --git a/ADR REPO - index changes.sql b/ADR REPO - index changes.sql new file mode 100644 index 0000000..e45f8ad --- /dev/null +++ b/ADR REPO - index changes.sql @@ -0,0 +1,123 @@ +/* +Missing Index Details from SQLQuery61.sql - swamarepprd01.centralinfra.net.ArizonaREP (CENTRALINFRA\ua208700 (142)) +The Query Processor estimates that implementing the following index could improve the query cost by 22.4378%. +*/ + + +USE [ArizonaREP] +GO + +return +--EXEC sp_rename 'dbo.Address_update_history.NCIX_Addressupdatehistory_COL_AUHtargetupdatedate' +--,'NCIX_Addressupdatehistory_COL_AUHtargetupdatedate_old' +--,'index' + + +--CREATE NONCLUSTERED INDEX [NCIX_Addressupdatehistory_COL_AUHtargetupdatedate] +--ON [dbo].[Address_update_history] ([AUH_target_OU],[AUH_target_update_date]) +--INCLUDE ([AUH_address],[AUH_update_date]) +--GO + +---- NCIX_Addressupdatehistory_COL_AUHtargetupdatedate_old +--IF INDEXPROPERTY(OBJECT_ID('dbo.Address_update_history'), 'NCIX_Addressupdatehistory_COL_AUHtargetupdatedate_old' , 'IndexID' ) IS NOT NULL BEGIN; +-- DROP INDEX dbo.Address_update_history.NCIX_Addressupdatehistory_COL_AUHtargetupdatedate_old; +--END; +--GO + + + + +---- NCIX_Address_COL_ADtopmasteraddress +--EXEC sp_rename 'dbo.Address.NCIX_Address_COL_ADtopmasteraddress','NCIX_Address_COL_ADtopmasteraddress_to_del','index' + +--IF INDEXPROPERTY(OBJECT_ID('dbo.Address'), 'NCIX_Address_COL_ADtopmasteraddress' , 'IndexID' ) IS NOT NULL BEGIN; +-- DROP INDEX dbo.Address.NCIX_Address_COL_ADtopmasteraddress; +--END; +--GO +--IF INDEXPROPERTY(OBJECT_ID('dbo.Address'), 'NCIX_Address_COL_ADtopmasteraddress' , 'IndexID' ) IS NULL BEGIN; +-- CREATE INDEX NCIX_Address_COL_ADtopmasteraddress ON dbo.Address(AD_top_master_address) +-- INCLUDE([Address_GUID], [AD_master_address]); +--END; +--GO + +--IF INDEXPROPERTY(OBJECT_ID('dbo.Address'), 'NCIX_Address_COL_ADtopmasteraddress_to_del' , 'IndexID' ) IS NOT NULL BEGIN; +-- DROP INDEX dbo.Address.NCIX_Address_COL_ADtopmasteraddress_to_del; +--END; +--GO + + + +---- NCIX_Telecom_COL_TELType +--IF INDEXPROPERTY(OBJECT_ID('dbo.Telecom'), 'NCIX_Telecom_COL_TELType' , 'IndexID' ) IS NOT NULL BEGIN; +-- DROP INDEX dbo.Telecom.NCIX_Telecom_COL_TELType; +--END; +--GO +--IF INDEXPROPERTY(OBJECT_ID('dbo.Telecom'), 'NCIX_Telecom_COL_TELType' , 'IndexID' ) IS NULL BEGIN; +-- CREATE NONCLUSTERED INDEX NCIX_Telecom_COL_TELType +-- ON [dbo].[Telecom] ([TEL_type]) +-- INCLUDE ([Telecom_GUID],[TEL_address]) +--END; +--GO + + + +CREATE NONCLUSTERED INDEX [NCFIX_Address_COL_Status1_MasterAddressNull] +ON [dbo].[Address] ([AD_last_name]) +INCLUDE ( + [AD_activity], + [AD_APS_TS], + [AD_area], + [AD_can_be_subsidiary_updated], + [AD_communication_channel], + [AD_CUST_blocking], + [AD_CUST_remark], + [AD_customer_category_code], + [AD_customer_group_code], + [AD_employee], + [AD_mailing_language_code], + [AD_main_insurance_key], + [AD_main_insurance_name], + [AD_main_insurance_policy], + [AD_merge_date], + [AD_middle_name], + [AD_name_supplement], + [AD_OmniChannelUId], + [AD_Omnichannel_UUID], + [AD_remark], + [AD_salutation_text], + [AD_social_security_number], + [AD_supplier], + [AD_title_text], + [AD_top_master_address], + [AD_user_login], + [AD_address_1], + [AD_address_2], + [AD_address_3], + [AD_advertising], + [AD_birth_year], + [AD_city], + [AD_country_code], + [AD_country_text], + [AD_creation_OU], + [AD_CUST_remark_pharma], + [AD_customer], + [AD_date_of_birth], + [AD_first_name], + [AD_PH_height], + [AD_language_code], + [AD_mailing], + [AD_main_insurance_GUID], + [AD_memo], + [AD_name], + [AD_origin], + [AD_postal_routing_address], + [AD_sex], + [AD_title_code], + [AD_update_date], + [AD_update_OU], + [AD_PH_weight], + [AD_zip_code] +) +WHERE [AD_status] = 1 +AND [AD_master_address] IS NULL +WITH(FILLFACTOR=70); \ No newline at end of file diff --git a/ADR REPO - script to integrate.sql b/ADR REPO - script to integrate.sql new file mode 100644 index 0000000..7764ea7 --- /dev/null +++ b/ADR REPO - script to integrate.sql @@ -0,0 +1,90 @@ +USE [ArizonaREP]; +GO +/*============================================================================= + +Re-implementation of SQL Server STRING_SPLIT() for older versions of SQL Server + +Parameters +---------------------- +@string NVARCHAR(MAX) The string to split +@delimiter NCHAR(1) The delimiter to split on + +Returns a table with a single column "value" of type NVARCHAR(MAX) + +Creation : 29.09.2025 / TSC +Modifications: + +=============================================================================*/ + +CREATE OR ALTER FUNCTION [dbo].[fnSplitString] ( + @string NVARCHAR(MAX), + @delimiter NCHAR(1) +) +RETURNS @output TABLE ( + [value] NVARCHAR(MAX) NULL +) +BEGIN + DECLARE @start INT, + @end INT; + SELECT @start = 1, + @end = CHARINDEX(@delimiter, @string); + WHILE @start < LEN(@string) + 1 + BEGIN + IF @end = 0 + SET @end = LEN(@string) + 1; + + INSERT INTO @output ( + [value] + ) + VALUES ( + SUBSTRING(@string, @start, @end - @start) + ); + SET @start = @end + 1; + SET @end = CHARINDEX(@delimiter, @string, @start); + + END; + RETURN; +END; +GO +--#endregion fn_StringSplit() + +--#region aps_get_address_authorization_granted_bulk +GO +/*============================================================================= + +Parse a list of comma separated addresses_guid and check for each of them +if a charte has been approved. + +Extension of the scalar function [aps_fn_Is_Address_Authorization_Granted] to allow +more than 1 address to be validated at once + +Parameters +---------------------- +@addresse_guid_list VARCHAR(MAX) A comma delimited list of GUID to be checked for chart validation + +Context +---------------------- +Deployed and used in the adresse repositories + +Creation : 25.09.2025 / TSC +Modifications: + +=============================================================================*/ +CREATE OR ALTER PROCEDURE dbo.aps_get_address_authorization_granted_bulk + @addresse_guid_list VARCHAR(MAX) +AS +BEGIN + + WITH [cteValues] AS ( + --transform input values in a table + SELECT [value] AS [address_guid] + FROM [dbo].fnSplitString(@addresse_guid_list, ',') + ) + + SELECT + v.[address_guid] + , dbo.[aps_fn_Is_Address_Authorization_Granted](v.[address_guid],1,null) AS isGranted + FROM [cteValues] v; +END +GO +--#endregion aps_get_address_authorization_granted_bulk diff --git a/ADR REPO - simplest aps_fn_Is_Address_Authorization_Granted replacement.sql b/ADR REPO - simplest aps_fn_Is_Address_Authorization_Granted replacement.sql new file mode 100644 index 0000000..5a7b440 --- /dev/null +++ b/ADR REPO - simplest aps_fn_Is_Address_Authorization_Granted replacement.sql @@ -0,0 +1,49 @@ +USE [ArizonaREP]; +GO + +--#region fn_StringSplit() +CREATE OR ALTER FUNCTION [dbo].[fnSplitString] ( + @string NVARCHAR(MAX), + @delimiter CHAR(1) +) +RETURNS @output TABLE ( + [value] NVARCHAR(MAX) +) +BEGIN + DECLARE @start INT, + @end INT; + SELECT @start = 1, + @end = CHARINDEX(@delimiter, @string); + WHILE @start < LEN(@string) + 1 + BEGIN + IF @end = 0 + SET @end = LEN(@string) + 1; + + INSERT INTO @output ( + [value] + ) + VALUES ( + SUBSTRING(@string, @start, @end - @start) + ); + SET @start = @end + 1; + SET @end = CHARINDEX(@delimiter, @string, @start); + + END; + RETURN; +END; +--#endregion fn_StringSplit() +GO + +DECLARE @input VARCHAR(MAX) + = 'C73898FF-5503-4565-BF1B-0EB6B9C931C3,7827AE66-6A0A-4CC9-A285-EF9269FC720D,3568B542-C543-4392-A370-88C9CD64F8C8,665A9FF2-2C31-4CFF-B341-6B657AAAB801,1B839554-509A-4CFC-802A-24F3094615D7,A8F72DC3-3398-47FE-80FD-31B316B4963D,A40AAEB1-1EDB-445F-B5E6-34BBED9640D8,E51A1139-9B7A-422F-8B54-ECB505DDB8E3,5B59C63B-6F9F-4C27-B29E-FFE75E952249,36C6EB7C-9E6E-40BC-8F95-FAB7C24667A0,3F358729-17EA-46F5-89F8-3D479025B9F9,BDF0B7BA-B6AD-4C85-9D61-C0BCFAC583AA,51F2424E-F612-4C2B-8BC5-9CB4A99F5A46,2CF05930-C477-44F9-9595-4B78F696CFFD,04CDF0CC-0241-41EC-969F-FA0749794F46,72433873-0DC5-46D0-9C06-BD568D31C7AE,8EC41453-AB8D-4F16-859B-E2EDBD2DBB2F,C390DC70-26FC-46E7-9080-45C9BE1D6889,E0BD4EAF-4CC0-42D1-ADAB-4D7471A68283,B118BE7E-563D-4316-B7CC-1F01CEE3B039,C9B34504-166C-48C4-822D-617C51220748,F586CCCA-23A2-40A0-84B7-436779762DC4,2D0C6359-A098-428E-A6AE-DBBBABF043AE,9A619595-02B6-44A6-B82B-F679D8724874,DDDE8312-124C-4B58-904E-5048A04ED389,37EF5C4A-EA7D-4EBA-8953-95658CFF0BA5,BD035A75-BE42-43E7-A9AC-23F33A81A5C5,635B9C48-38B7-405F-89CF-09F1327D4071,C325545D-2B8C-4CB7-A41D-B0CB421EE844,09A57484-66B9-43CA-B9D3-3E4ED363C730,048DD6ED-1D33-4741-AF28-897B6FBE27ED,7E8488A5-A56F-47D8-B393-7A0B43776A68,5E2DA8D5-36DD-4F07-8C16-3DFF1D21F023,B5E69008-2989-4CFA-86D4-946E591170D8,DC613FD4-A0AA-4D17-ADDF-7D26F3EEAC4F,CA0B8803-EFE4-44C9-A664-5B4123EAE7EE,8CF9A86D-E257-4213-B82E-A6AFB42C5E0B,D76A5BC9-6F5C-4124-A3FF-055128763D43,72440A44-6567-4695-910F-3D0977E114E9,E78B77D9-9CC3-417B-8E79-FB35324EB2D6,F19D17F5-F5ED-4A12-BC03-3A319CA8B8E2,2B00E466-CEA3-4AC6-BF69-E46534E8CE52,798D1622-811E-436E-BDB5-38635507BDC0,029E540F-8143-49A5-A047-7E623B387730,4367A715-5BFB-4239-B64E-D14EA6206130,15AFCAB3-AB1A-44B8-8772-A70B117339CE,04FF167C-6FE9-41D7-9015-50AD4BE27FF4,7CB284A9-F767-41F6-9AEC-3FC94FAE1EB4,F94A54D5-7DF0-43EA-A060-470CA7F3EFAC,68D94F61-6F14-4961-9A6F-4B8DBAE59799,C64326DA-EDF8-4FF9-8CE0-F0E380A28A1C,697E54FB-8D7B-4555-AF4F-38443078A01D,198B8239-D9F0-4148-A33F-C472BD3791AF,C7747A95-0CB0-4507-A35E-3C90C4DCA928,CEE05E37-705E-4BEE-BD9D-64CA38B8CC41,58B7055E-446C-4418-8917-CE2F3F286977,1A45D7AF-5CB5-420B-97E2-65831FB0B1FE,E4347572-64D3-484F-85EE-903D7DA8E58B,1C5B9754-14CD-4C81-AE75-FD095F089564,7DDC7190-7B92-427A-87C4-8E4B47348236,5BC2E239-C984-4D93-BEDE-1AEA1AD75016,81CDA684-3B50-4B09-A982-84F7F9640B18,2BF35438-E23F-4288-B187-237E6B9A8557,0F3EA17E-F334-4A3B-A8D4-8DC0FF91BCE2,A89197EB-013D-4A2D-898F-AE79191799C7,0BBBCD77-3333-4FF8-B06E-2547D6EC1FAD,0B4E5C88-3AB3-4925-9551-89602C024E0E,4ADAA89F-0409-459E-AE07-0A675BE9426D,8C5340AC-4119-47C0-B06F-F03A52B1B6BF,6EC0ED06-AE8A-4144-A638-1D19CB796EC0,832DC701-F925-47D3-8E64-A068EE6C36AB,39904FFA-ACA7-4E30-A68B-06C4416D3888,6736CE51-FF16-4C23-ABCB-BB85096A08B7,E158BEAB-7D32-4242-BCC9-3EE3E357CF4F,1042E15B-9E87-4F92-AB31-54FA46643F2C,C1ADDF37-C581-473E-B757-37C7F6E85A77,2D93F824-FEE3-4175-9F40-02846EBCCA0E,FB1B5495-6E45-4D3B-8FAC-98CAD37718FF,D27F9EF5-5D45-4A16-82BC-99DA574286EA,B79AE10A-0CB5-4CBA-BB18-2DE32C43077B,3EB0947C-2CF7-4272-B46A-00CB35ECFF9D,069D4B6B-D356-47D3-9FF3-ECC53BD6CC62,D7E8F35B-A2E7-4562-9F4F-0119EB068FBD,D429C601-EE85-440F-AC66-11BAACC11F69,5F6978C3-C8F0-46AA-9222-74746E103458,09611BCB-26D6-4D9D-972E-08759AF0DA30,7CF6034E-E4E3-4E82-AA27-185972146F41,52DECBE0-78DC-4393-9C09-069FD324165F,052A31BB-2E57-480A-BF49-1524631114E6,8B03ADF6-BBC8-49E9-9B15-AAFD915ADD83,B7C190CA-12B1-4B7B-9EBF-D9D208CF364C,82855646-59C3-461E-8BBF-CEDBE0EA235C,94C980B9-FC43-4EC2-BF7C-77C00AD44CE1,51AB8015-B7BA-44DB-888B-F75D797B03EB,87696D53-AE00-40B6-897A-0B9E89119A97,4BEF71D1-BD1A-4F39-8C13-31DCC56FC51F,96DC1B07-ABA3-4560-B844-D76FFAD70DFB,EB435CF7-B5E3-4A5F-A348-B8F0E06FDC9D,D0A09608-F66C-43F9-AF8A-75AEEE27358A,9E9D0D81-4733-4E98-AE0D-B5D3D62ECE17,173DB54C-9615-418F-AC50-236733BF1A5E'; + +WITH [cteValues] AS ( + --transform input values in a table + SELECT [value] AS [address_guid] + FROM [dbo].fnSplitString(@input, ',') +) + +SELECT + v.[address_guid] + , dbo.[aps_fn_Is_Address_Authorization_Granted](v.[address_guid],1,null) AS isGranted +FROM [cteValues] v \ No newline at end of file diff --git a/CRS dev - bkp restore data with bcp.sql b/CRS dev - bkp restore data with bcp.sql new file mode 100644 index 0000000..2364792 --- /dev/null +++ b/CRS dev - bkp restore data with bcp.sql @@ -0,0 +1,61 @@ +USE [distribution] + +DECLARE @hyperscale NVARCHAR(500)='sql-triapharmamaprod-sqlserver01.database.windows.net'; +DECLARE @tpl_archive NVARCHAR(MAX)='bcp.exe @tbl@ out d:\tsc\@tbl_file@_@host@.bcp -S @fqdn@ -T -d arizona -n'; +DECLARE @tpl_rest NVARCHAR(MAX)='bcp.exe @dst@.@tbl@ in d:\tsc\@tbl_file@_@host@.bcp -S @hyperscale@ -T -d pharmacy -n'; +DECLARE @tbl_full NVARCHAR(500); +DECLARE @tbl_only NVARCHAR(500); +DECLARE @tbl_file NVARCHAR(500); +DECLARE @dst_schema NVARCHAR(100); +DECLARE @fqdn NVARCHAR(500); +DECLARE @host NVARCHAR(255); +DECLARE @cmd TABLE( + id INT IDENTITY + , fqdn NVARCHAR(500) NOT NULL + , tbl_name NVARCHAR(500) NOT NULL + , cmd_archive NVARCHAR(MAX) NULL + , cmd_restore NVARCHAR(MAX) NULL +); + +SELECT + @host = LOWER(SUBSTRING(name,0,CHARINDEX('\',name))) + ,@dst_schema = LOWER(CONCAT(SUBSTRING(name, 3, 6),'_dbo')) +FROM sys.[servers] AS [s] +WHERE [s].[server_id]=0; + +SELECT @fqdn = CONCAT(@host,'.centralinfra.net,1433'); + +DECLARE csr_articles CURSOR FAST_FORWARD READ_ONLY FOR + SELECT CONCAT([ms].[source_owner],'.',[ms].[source_object]) AS tbl, [ms].[source_object] AS tbl_only + FROM [dbo].[MSarticles] AS [ms] + WHERE [ms].[publisher_db]='Arizona' + +OPEN csr_articles + +FETCH NEXT FROM csr_articles INTO @tbl_full, @tbl_only + +WHILE @@FETCH_STATUS = 0 +BEGIN + SET @tbl_file = REPLACE(@tbl_full,'.','_'); + INSERT INTO @cmd ( + [fqdn], + [tbl_name], + [cmd_archive], + [cmd_restore] + ) + SELECT + @fqdn-- fqdn + ,@tbl_full-- tbl_name + ,REPLACE(REPLACE(REPLACE(REPLACE(@tpl_archive, '@tbl@', @tbl_full),'@tbl_file@',@tbl_file),'@host@',@host),'@fqdn@', @fqdn) + ,REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(@tpl_rest, '@tbl@', @tbl_only),'@tbl_file@',@tbl_file),'@host@',@host),'@hyperscale@', @hyperscale), '@dst@',@dst_schema) + ; + + + FETCH NEXT FROM csr_articles INTO @tbl_full, @tbl_only +END + +CLOSE csr_articles +DEALLOCATE csr_articles + +SELECT * +FROM @cmd AS [c] diff --git a/CRS dev - create needed structure in dbo.sql b/CRS dev - create needed structure in dbo.sql new file mode 100644 index 0000000..79e8aba --- /dev/null +++ b/CRS dev - create needed structure in dbo.sql @@ -0,0 +1,672 @@ +-- Created by GitHub Copilot in SSMS - review carefully before executing +DECLARE @tpl NVARCHAR(MAX)= ' +IF EXISTS (SELECT 1 FROM sys.tables WHERE name = ''Entry'' AND schema_id = SCHEMA_ID(''@dbo@'')) + DROP TABLE @dbo@.Entry; + +IF NOT EXISTS (SELECT 1 FROM sys.tables WHERE name = ''Entry'' AND schema_id = SCHEMA_ID(''@dbo@'')) +CREATE TABLE @dbo@.Entry ( + Entry_ID int NOT NULL, + ET_accounting_period int NOT NULL, + ET_document_header int NOT NULL, + ET_sales_tax_code int NULL, + ET_currency int NOT NULL, + ET_entry_type int NOT NULL, + ET_account int NOT NULL, + ET_predefined_entry int NULL, + ET_entry_address int NULL, + ET_batch_run int NULL, + ET_value_date datetime NOT NULL, + ET_original_date datetime NOT NULL, + ET_input_date datetime NOT NULL, + ET_debit_base_amount decimal(14,2) NULL, + ET_credit_base_amount decimal(14,2) NULL, + ET_debit_currency_amount decimal(14,2) NULL, + ET_credit_currency_amount decimal(14,2) NULL, + ET_exchange_rate float NOT NULL DEFAULT (1), + ET_debit_quantity decimal(11,4) NULL, + ET_credit_quantity decimal(11,4) NULL, + ET_extourne_number int NULL, + ET_official_number int NULL, + ET_text varchar(60) NULL, + ET_hide_code bit NOT NULL DEFAULT (0), + ET_tax_reclaiming_rate decimal(5,2) NULL, + ET_VAT_identifier varchar(60) NULL, + ET_TS timestamp NOT NULL, + ET_tax_base_currency_amount decimal(14,2) NULL, + ET_interco_type smallint NULL, + ET_VGUID varchar(36) NULL DEFAULT (newid()), + ET_master_ID varchar(60) NULL, + ET_reconciliation_status smallint NULL, + ET_reconciliation_base_amount decimal(14,2) NULL, + ET_reconciliation_curr_amount decimal(14,2) NULL, + ET_bmc_user_profile int NULL, + ET_APS_TS datetime NULL DEFAULT (getdate()), + ET_rowguid uniqueidentifier NOT NULL DEFAULT (newsequentialid()), + ET_pharmacy_code char(6) NOT NULL DEFAULT (''@phcode@''), + CONSTRAINT PK_Entry PRIMARY KEY NONCLUSTERED (Entry_ID), + CONSTRAINT CK_ET_interco_type CHECK ([ET_interco_type] >= 1 and [ET_interco_type] <= 3), + CONSTRAINT CK_ET_pharmacy_code CHECK ([ET_pharmacy_code]=''@phcode@'') +); + +IF EXISTS (SELECT 1 FROM sys.tables WHERE name = ''Entry_reconciliation'' AND schema_id = SCHEMA_ID(''@dbo@'')) + DROP TABLE @dbo@.Entry_reconciliation; + +IF NOT EXISTS (SELECT 1 FROM sys.tables WHERE name = ''Entry_reconciliation'' AND schema_id = SCHEMA_ID(''@dbo@'')) +CREATE TABLE @dbo@.Entry_reconciliation ( + Entry_reconciliation_ID int NOT NULL, + ETR_entry int NOT NULL, + ETR_linked_entry int NOT NULL, + ETR_base_amount decimal(14,2) NULL, + ETR_currency_amount decimal(14,2) NULL, + ETR_debit_base_amount decimal(14,2) NULL, + ETR_credit_base_amount decimal(14,2) NULL, + ETR_debit_currency_amount decimal(14,2) NULL, + ETR_credit_currency_amount decimal(14,2) NULL, + ETR_value_date datetime NULL, + ETR_remark varchar(255) NULL, + ETR_TS timestamp NOT NULL, + ETR_VGUID varchar(36) NULL DEFAULT (newid()), + ETR_master_ID varchar(60) NULL, + ETR_rowguid uniqueidentifier NOT NULL DEFAULT (newsequentialid()), + ETR_pharmacy_code char(6) NOT NULL DEFAULT (''@phcode@''), + CONSTRAINT PK_Entry_reconciliation PRIMARY KEY NONCLUSTERED (Entry_reconciliation_ID), + CONSTRAINT CK_ETR_pharmacy_code CHECK ([ETR_pharmacy_code]=''@phcode@'') +); + +IF EXISTS (SELECT 1 FROM sys.tables WHERE name = ''Financial_relation_account'' AND schema_id = SCHEMA_ID(''@dbo@'')) + DROP TABLE @dbo@.Financial_relation_account; + +IF NOT EXISTS (SELECT 1 FROM sys.tables WHERE name = ''Financial_relation_account'' AND schema_id = SCHEMA_ID(''@dbo@'')) +CREATE TABLE @dbo@.Financial_relation_account ( + Financial_relation_account_ID int NOT NULL, + FNRA_subsidiary int NOT NULL, + FNRA_BVR_member int NULL, + FNRA_source_financial_relation int NULL, + FNRA_address int NOT NULL, + FNRA_beneficiary_address int NULL, + FNRA_document_predefined_entry int NULL, + FNRA_payment_predefined_entry int NULL, + FNRA_financial_institution int NOT NULL, + FNRA_account int NULL, + FNRA_supplier_DTA_structure uniqueidentifier NULL, + FNRA_payroll_DTA_structure uniqueidentifier NULL, + FNRA_sequence smallint NULL, + FNRA_account_number varchar(30) NULL, + FNRA_text varchar(60) NULL, + FNRA_house_bank bit NOT NULL DEFAULT ((0)), + FNRA_by_default bit NOT NULL DEFAULT ((0)), + FNRA_by_default_payroll bit NOT NULL DEFAULT ((0)), + FNRA_cust_ident varchar(15) NULL, + FNRA_doc_number_pos smallint NOT NULL DEFAULT ((0)), + FNRA_doc_number_length smallint NULL, + FNRA_value_date_pos smallint NOT NULL DEFAULT ((0)), + FNRA_value_date_length smallint NULL, + FNRA_value_date_format varchar(15) NULL, + FNRA_DTA_identifier varchar(15) NULL, + FNRA_DTA_payroll_identifier varchar(15) NULL, + FNRA_IBAN_identifier varchar(60) NULL, + FNRA_bank_fees_settlement smallint NULL, + FNRA_active bit NOT NULL DEFAULT ((1)), + FNRA_EAS_process bit NOT NULL DEFAULT ((0)), + FNRA_VGUID varchar(36) NULL DEFAULT (newid()), + FNRA_master_ID varchar(60) NULL, + FNRA_TS timestamp NOT NULL, + FNRA_QR_IBAN_identifier varchar(60) NULL, + FNRA_rowguid uniqueidentifier NOT NULL DEFAULT (newsequentialid()), + FNRA_pharmacy_code char(6) NOT NULL DEFAULT (''@phcode@''), + CONSTRAINT PK_Financial_relation_account PRIMARY KEY NONCLUSTERED (Financial_relation_account_ID), + CONSTRAINT CK_FNRA_bank_fees_settlement CHECK ([FNRA_bank_fees_settlement]>=(1) AND [FNRA_bank_fees_settlement]<=(3)), + CONSTRAINT CK_FNRA_pharmacy_code CHECK ([FNRA_pharmacy_code]=''@phcode@'') +); + +IF EXISTS (SELECT 1 FROM sys.tables WHERE name = ''Address'' AND schema_id = SCHEMA_ID(''@dbo@'')) + DROP TABLE @dbo@.Address; + +IF NOT EXISTS (SELECT 1 FROM sys.tables WHERE name = ''Address'' AND schema_id = SCHEMA_ID(''@dbo@'')) +CREATE TABLE @dbo@.Address ( + Address_ID int NOT NULL, + AD_title int NULL, + AD_language int NOT NULL, + AD_mailing_language int NULL, + AD_country int NOT NULL, + AD_bmc_user_profile int NULL, + AD_name varchar(60) NULL, + AD_name_supplement varchar(255) NULL, + AD_first_name varchar(30) NULL, + AD_middle_name varchar(4) NULL, + AD_last_name varchar(30) NULL, + AD_address_1 varchar(60) NULL, + AD_address_2 varchar(60) NULL, + AD_address_3 varchar(60) NULL, + AD_zip_code varchar(15) NULL, + AD_city varchar(30) NULL, + AD_state varchar(15) NULL, + AD_postal_routing_address varchar(60) NULL, + AD_area varchar(15) NULL, + AD_activity varchar(255) NULL, + AD_EDI_identifier varchar(15) NULL, + AD_VAT_identifier varchar(60) NULL, + AD_swisskey varchar(30) NULL, + AD_EU_identity_code varchar(15) NULL, + AD_sex smallint NOT NULL DEFAULT (3), + AD_date_of_birth datetime NULL, + AD_mailing bit NOT NULL DEFAULT (0), + AD_advertising bit NOT NULL DEFAULT (0), + AD_status smallint NOT NULL DEFAULT (1), + AD_remark varchar(255) NULL, + AD_memo nvarchar(max) NULL, + AD_concordat varchar(15) NULL, + AD_place_of_origin varchar(30) NULL, + AD_place_of_birth varchar(30) NULL, + AD_social_security_number varchar(30) NULL, + AD_qualification varchar(255) NULL, + AD_creation_date datetime NULL, + AD_modified bit NOT NULL DEFAULT (0), + AD_TS timestamp NOT NULL, + AD_VGUID varchar(36) NULL DEFAULT (newid()), + AD_master_ID varchar(60) NULL, + AD_criteria_schema_header uniqueidentifier NULL, + AD_end_date_validity datetime NULL, + AD_customs_identifier varchar(15) NULL, + AD_enterprise_identifier varchar(30) NULL, + AD_geo_address varchar(60) NULL, + AD_geo_zip_code varchar(15) NULL, + AD_geo_city varchar(60) NULL, + AD_geo_state varchar(15) NULL, + AD_geo_country int NULL, + AD_geo_postal_routing_address varchar(60) NULL, + AD_rowguid uniqueidentifier NOT NULL DEFAULT (newsequentialid()), + AD_pharmacy_code char(6) NOT NULL DEFAULT (''@phcode@''), + AD_origin tinyint NOT NULL DEFAULT ((4)), + AD_omnichannel_UUID char(64) NULL, + AD_address_supplement varchar(60) NULL, + CONSTRAINT PK_Address PRIMARY KEY NONCLUSTERED (Address_ID), + CONSTRAINT CK_AD_origin CHECK ([AD_origin]=(5) OR [AD_origin]=(4) OR [AD_origin]=(3) OR [AD_origin]=(2) OR [AD_origin]=(1)), + CONSTRAINT CK_AD_pharmacy_code CHECK ([AD_pharmacy_code]=''@phcode@''), + CONSTRAINT CK_AD_sex CHECK ([AD_sex] >= 1 and [AD_sex] <= 4), + CONSTRAINT CK_AD_status CHECK ([AD_status] = 99 or [AD_status] = 5 or [AD_status] = 4 or [AD_status] = 3 or [AD_status] = 2 or [AD_status] = 1) +); + +IF EXISTS (SELECT 1 FROM sys.tables WHERE name = ''Address_Criteria'' AND schema_id = SCHEMA_ID(''@dbo@'')) + DROP TABLE @dbo@.Address_Criteria; + +IF NOT EXISTS (SELECT 1 FROM sys.tables WHERE name = ''Address_Criteria'' AND schema_id = SCHEMA_ID(''@dbo@'')) +CREATE TABLE @dbo@.Address_Criteria ( + Address_criteria_ID int NOT NULL, + ADCR_subsidiary int NULL, + ADCR_address int NOT NULL, + ADCR_criteria int NOT NULL, + ADCR_criteria_weight smallint NULL, + ADCR_remark nvarchar(max) NULL, + ADCR_update_date datetime NULL, + ADCR_active bit NOT NULL DEFAULT (1), + ADCR_TS timestamp NOT NULL, + ADCR_valid_from datetime NULL, + ADCR_valid_until datetime NULL, + ADCR_VGUID varchar(36) NULL DEFAULT (newid()), + ADCR_master_ID varchar(60) NULL, + ADCR_rowguid uniqueidentifier NOT NULL DEFAULT (newsequentialid()), + ADCR_pharmacy_code char(6) NOT NULL DEFAULT (''@phcode@''), + CONSTRAINT PK_Address_criteria PRIMARY KEY NONCLUSTERED (Address_criteria_ID), + CONSTRAINT CK_ADCR_pharmacy_code CHECK ([ADCR_pharmacy_code]=''@phcode@'') +); + +IF EXISTS (SELECT 1 FROM sys.tables WHERE name = ''Address_key'' AND schema_id = SCHEMA_ID(''@dbo@'')) + DROP TABLE @dbo@.Address_key; + +IF NOT EXISTS (SELECT 1 FROM sys.tables WHERE name = ''Address_key'' AND schema_id = SCHEMA_ID(''@dbo@'')) +CREATE TABLE @dbo@.Address_key ( + Address_key_ID int NOT NULL, + ADK_subsidiary int NOT NULL, + ADK_address int NOT NULL, + ADK_key varchar(15) NULL, + ADK_type smallint NOT NULL DEFAULT (2), + ADK_remark varchar(255) NULL, + ADK_user_ID varchar(18) NULL, + ADK_APS_TS datetime NOT NULL DEFAULT (getdate()), + ADK_VGUID varchar(36) NULL DEFAULT (newid()), + ADK_master_ID varchar(60) NULL, + ADK_TS timestamp NOT NULL, + ADK_rowguid uniqueidentifier NOT NULL DEFAULT (newsequentialid()), + ADK_pharmacy_code char(6) NOT NULL DEFAULT (''@phcode@''), + CONSTRAINT PK_Address_key PRIMARY KEY NONCLUSTERED (Address_key_ID), + CONSTRAINT CK_ADK_pharmacy_code CHECK ([ADK_pharmacy_code]=''@phcode@'') +); + +IF EXISTS (SELECT 1 FROM sys.tables WHERE name = ''Document_error'' AND schema_id = SCHEMA_ID(''@dbo@'')) + DROP TABLE @dbo@.Document_error; + +IF NOT EXISTS (SELECT 1 FROM sys.tables WHERE name = ''Document_error'' AND schema_id = SCHEMA_ID(''@dbo@'')) +CREATE TABLE @dbo@.Document_error ( + Document_error_GUID uniqueidentifier NOT NULL, + DE_document_header int NULL, + DE_document_line int NULL, + DE_reason int NOT NULL, + DE_remedy int NULL, + DE_bmc_user_profile int NOT NULL, + DE_creation_date datetime NOT NULL DEFAULT (getdate()), + DE_update_date datetime NULL, + DE_proceed bit NOT NULL DEFAULT ((0)), + DE_remark varchar(8000) NULL, + DE_APS_TS datetime NOT NULL DEFAULT (getdate()), + DE_VGUID varchar(36) NULL DEFAULT (newid()), + DE_master_ID varchar(60) NULL, + DE_TS timestamp NOT NULL, + DE_delivery_note_header int NULL, + DE_xml_remark xml NULL, + DE_xml_data xml NULL, + DE_triaFact_update_date datetime NULL, + DE_pharmacy_code char(6) NOT NULL DEFAULT (''@phcode@''), + CONSTRAINT PK_Document_error PRIMARY KEY NONCLUSTERED (Document_error_GUID), + CONSTRAINT CK_DE_pharmacy_code CHECK ([DE_pharmacy_code]=''@phcode@'') +); + +IF EXISTS (SELECT 1 FROM sys.tables WHERE name = ''Accounting_turnover_agg'' AND schema_id = SCHEMA_ID(''@dbo@'')) + DROP TABLE @dbo@.Accounting_turnover_agg; + +IF NOT EXISTS (SELECT 1 FROM sys.tables WHERE name = ''Accounting_turnover_agg'' AND schema_id = SCHEMA_ID(''@dbo@'')) +CREATE TABLE @dbo@.Accounting_turnover_agg ( + Accounting_turnover_agg_ID int IDENTITY(1,1) NOT NULL, + ATA_organizational_unit int NOT NULL, + ATA_type tinyint NOT NULL, + ATA_debit_credit tinyint NOT NULL, + ATA_sub_type tinyint NOT NULL, + ATA_expense_item_key varchar(30) NULL, + ATA_nature tinyint NOT NULL, + ATA_sub_nature varchar(15) NULL, + ATA_tax_code varchar(4) NULL, + ATA_amount decimal(14,2) NOT NULL, + ATA_amount_VAT decimal(14,2) NOT NULL, + ATA_tax_amount decimal(14,2) NOT NULL, + ATA_accounting_value_date datetime2(7) NOT NULL, + ATA_load_date datetime2(7) NOT NULL, + ATA_tax_rate decimal(3,2) NULL, + ATA_pharmacy_code char(6) NOT NULL DEFAULT (''@phcode@''), + ATA_doc_number varchar(15) NULL, + CONSTRAINT PK_Accounting_turnover_agg PRIMARY KEY CLUSTERED (Accounting_turnover_agg_ID), + CONSTRAINT CK_ATA_pharmacy_code CHECK ([ATA_pharmacy_code]=''@phcode@'') +); + +IF EXISTS (SELECT 1 FROM sys.tables WHERE name = ''Account'' AND schema_id = SCHEMA_ID(''@dbo@'')) + DROP TABLE @dbo@.Account; + +IF NOT EXISTS (SELECT 1 FROM sys.tables WHERE name = ''Account'' AND schema_id = SCHEMA_ID(''@dbo@'')) +CREATE TABLE @dbo@.Account ( + Account_ID int NOT NULL, + AC_sales_tax_code int NULL, + AC_default_currency int NOT NULL, + AC_column_swap_account_number int NULL, + AC_print_style int NULL, + AC_account_interest int NULL, + AC_transitory_account int NULL, + AC_type smallint NOT NULL DEFAULT ((1)), + AC_can_be_debited bit NOT NULL DEFAULT ((1)), + AC_can_be_credited bit NOT NULL DEFAULT ((1)), + AC_availability_start_date datetime NOT NULL, + AC_availability_end_date datetime NULL, + AC_liable_to_tax smallint NOT NULL DEFAULT ((1)), + AC_credit_limit_alert decimal NULL, + AC_credit_limit_blocking decimal NULL, + AC_credit_limit_action smallint NULL, + AC_currency_revaluation bit NOT NULL DEFAULT ((0)), + AC_foreign_currency_allowed bit NOT NULL DEFAULT ((0)), + AC_multicurrency bit NOT NULL DEFAULT ((0)), + AC_replacement_account int NULL, + AC_balance_sheet_column_swap bit NOT NULL DEFAULT ((0)), + AC_CA_breakdown_required bit NOT NULL DEFAULT ((0)), + AC_PCT_required bit NOT NULL DEFAULT ((0)), + AC_PJE_breakdown_required bit NOT NULL DEFAULT ((0)), + AC_cash_and_bank_account_code smallint NULL DEFAULT ((1)), + AC_number_of_decimals smallint NULL, + AC_tax_reclaiming_rate decimal NULL, + AC_def_currency_rate_type smallint NOT NULL DEFAULT ((1)), + AC_remark varchar(255) NULL, + AC_grouping_level_1 smallint NULL DEFAULT ((1)), + AC_grouping_level_2 smallint NULL DEFAULT ((1)), + AC_reconciliation bit NOT NULL DEFAULT ((1)), + AC_depreciation smallint NOT NULL DEFAULT ((2)), + AC_TS timestamp NOT NULL, + AC_VGUID varchar(36) NULL DEFAULT (newid()), + AC_master_ID varchar(60) NULL, + AC_rowguid uniqueidentifier NOT NULL DEFAULT (newsequentialid()), + AC_pharmacy_code char(6) NOT NULL DEFAULT (''@phcode@''), + CONSTRAINT PK_Account PRIMARY KEY NONCLUSTERED (Account_ID), + CONSTRAINT CK_Account_pharmacy_code CHECK ([AC_pharmacy_code]=''@phcode@'') +); + +IF EXISTS (SELECT 1 FROM sys.tables WHERE name = ''Account_key'' AND schema_id = SCHEMA_ID(''@dbo@'')) + DROP TABLE @dbo@.Account_key; + +IF NOT EXISTS (SELECT 1 FROM sys.tables WHERE name = ''Account_key'' AND schema_id = SCHEMA_ID(''@dbo@'')) +CREATE TABLE @dbo@.Account_key ( + Account_key_ID int NOT NULL, + ACK_accounting_plan int NOT NULL, + ACK_fiscal_year int NOT NULL, + ACK_account int NOT NULL, + ACK_key varchar(30) NULL, + ACK_type smallint NOT NULL, + ACK_remark varchar(255) NULL, + ACK_TS timestamp NOT NULL, + ACK_VGUID varchar(36) NULL DEFAULT (newid()), + ACK_master_ID varchar(60) NULL, + ACK_rowguid uniqueidentifier NOT NULL DEFAULT (newsequentialid()), + ACK_pharmacy_code char(6) NOT NULL DEFAULT (''@phcode@''), + CONSTRAINT PK_Account_key PRIMARY KEY NONCLUSTERED (Account_key_ID), + CONSTRAINT CK_Account_key_pharmacy_code CHECK ([ACK_pharmacy_code]=''@phcode@'') +); + +IF EXISTS (SELECT 1 FROM sys.tables WHERE name = ''Account_link'' AND schema_id = SCHEMA_ID(''@dbo@'')) + DROP TABLE @dbo@.Account_link; + +IF NOT EXISTS (SELECT 1 FROM sys.tables WHERE name = ''Account_link'' AND schema_id = SCHEMA_ID(''@dbo@'')) +CREATE TABLE @dbo@.Account_link ( + Account_link_ID int NOT NULL, + ACL_subsidiary int NOT NULL, + ACL_address int NULL, + ACL_account int NOT NULL, + ACL_type smallint NOT NULL, + ACL_by_default bit NOT NULL DEFAULT (0), + ACL_remark varchar(255) NULL, + ACL_TS timestamp NOT NULL, + ACL_VGUID varchar(36) NULL DEFAULT (newid()), + ACL_master_ID varchar(60) NULL, + ACL_rowguid uniqueidentifier NOT NULL DEFAULT (newsequentialid()), + ACL_pharmacy_code char(6) NOT NULL DEFAULT (''@phcode@''), + CONSTRAINT PK_Account_link PRIMARY KEY NONCLUSTERED (Account_link_ID), + CONSTRAINT CK_Account_link_pharmacy_code CHECK ([ACL_pharmacy_code]=''@phcode@'') +); + +IF EXISTS (SELECT 1 FROM sys.tables WHERE name = ''Account_text'' AND schema_id = SCHEMA_ID(''@dbo@'')) + DROP TABLE @dbo@.Account_text; + +IF NOT EXISTS (SELECT 1 FROM sys.tables WHERE name = ''Account_text'' AND schema_id = SCHEMA_ID(''@dbo@'')) +CREATE TABLE @dbo@.Account_text ( + Account_text_ID int NOT NULL, + ACTX_account int NOT NULL, + ACTX_fiscal_year int NOT NULL, + ACTX_language int NOT NULL, + ACTX_usage_text varchar(30) NULL, + ACTX_text varchar(255) NULL, + ACTX_TS timestamp NOT NULL, + ACTX_VGUID varchar(36) NULL DEFAULT (newid()), + ACTX_master_ID varchar(60) NULL, + ACTX_instructions varchar(8000) NULL, + ACTX_rowguid uniqueidentifier NOT NULL DEFAULT (newsequentialid()), + ACTX_pharmacy_code char(6) NOT NULL DEFAULT (''@phcode@''), + CONSTRAINT PK_Account_text PRIMARY KEY NONCLUSTERED (Account_text_ID), + CONSTRAINT CK_Account_text_pharmacy_code CHECK ([ACTX_pharmacy_code]=''@phcode@'') +); + +IF EXISTS (SELECT 1 FROM sys.tables WHERE name = ''Batch_run'' AND schema_id = SCHEMA_ID(''@dbo@'')) + DROP TABLE @dbo@.Batch_run; + +IF NOT EXISTS (SELECT 1 FROM sys.tables WHERE name = ''Batch_run'' AND schema_id = SCHEMA_ID(''@dbo@'')) +CREATE TABLE @dbo@.Batch_run ( + Batch_run_ID int NOT NULL, + BR_subsidiary int NOT NULL, + BR_batch_type int NOT NULL, + BR_bmc_user_profile int NULL, + BR_batch_number varchar(15) NOT NULL, + BR_value_date datetime NULL, + BR_remark varchar(255) NULL, + BR_text varchar(60) NULL, + BR_status smallint NOT NULL DEFAULT (1), + BR_TS timestamp NOT NULL, + BR_VGUID varchar(36) NULL DEFAULT (newid()), + BR_master_ID varchar(60) NULL, + BR_parameters varchar(max) NULL, + BR_rowguid uniqueidentifier NOT NULL DEFAULT (newsequentialid()), + BR_pharmacy_code char(6) NOT NULL DEFAULT (''@phcode@''), + CONSTRAINT PK_Batch_run PRIMARY KEY NONCLUSTERED (Batch_run_ID), + CONSTRAINT CK_Batch_run_pharmacy_code CHECK ([BR_pharmacy_code]=''@phcode@'') +); + +IF EXISTS (SELECT 1 FROM sys.tables WHERE name = ''BVR_member'' AND schema_id = SCHEMA_ID(''@dbo@'')) + DROP TABLE @dbo@.BVR_member; + +IF NOT EXISTS (SELECT 1 FROM sys.tables WHERE name = ''BVR_member'' AND schema_id = SCHEMA_ID(''@dbo@'')) +CREATE TABLE @dbo@.BVR_member ( + BVR_member_ID int NOT NULL, + BVRM_member_number varchar(15) NULL, + BVRM_member_account varchar(15) NULL, + BVRM_bank smallint NOT NULL DEFAULT (1), + BVRM_cust_ident_pos smallint NOT NULL DEFAULT (0), + BVRM_cust_ident_length smallint NULL, + BVRM_TS timestamp NOT NULL, + BVRM_VGUID varchar(36) NULL DEFAULT (newid()), + BVRM_master_ID varchar(60) NULL, + BVR_rowguid uniqueidentifier NOT NULL DEFAULT (newsequentialid()), + BVRM_pharmacy_code char(6) NOT NULL DEFAULT (''@phcode@''), + CONSTRAINT PK_BVR_member PRIMARY KEY NONCLUSTERED (BVR_member_ID), + CONSTRAINT CK_BVR_member_pharmacy_code CHECK ([BVRM_pharmacy_code]=''@phcode@'') +); + +IF EXISTS (SELECT 1 FROM sys.tables WHERE name = ''CRS_batch_run'' AND schema_id = SCHEMA_ID(''@dbo@'')) + DROP TABLE @dbo@.CRS_batch_run; + +IF NOT EXISTS (SELECT 1 FROM sys.tables WHERE name = ''CRS_batch_run'' AND schema_id = SCHEMA_ID(''@dbo@'')) +CREATE TABLE @dbo@.CRS_batch_run ( + CRS_batch_run_ID int NOT NULL, + CRSBR_batch_run int NOT NULL, + CRSBR_conversation_ID int NOT NULL, + CRSBR_source_reference varchar(255) NULL, + CRSBR_rowguid uniqueidentifier NOT NULL DEFAULT (newsequentialid()), + CRSBR_pharmacy_code char(6) NOT NULL DEFAULT (''@phcode@''), + CONSTRAINT PK_CRS_batch_run PRIMARY KEY NONCLUSTERED (CRS_batch_run_ID), + CONSTRAINT CK_CRS_batch_run_pharmacy_code CHECK ([CRSBR_pharmacy_code]=''@phcode@'') +); + +IF EXISTS (SELECT 1 FROM sys.tables WHERE name = ''CRS_document_header'' AND schema_id = SCHEMA_ID(''@dbo@'')) + DROP TABLE @dbo@.CRS_document_header; + +IF NOT EXISTS (SELECT 1 FROM sys.tables WHERE name = ''CRS_document_header'' AND schema_id = SCHEMA_ID(''@dbo@'')) +CREATE TABLE @dbo@.CRS_document_header ( + CRS_document_header_ID int NOT NULL, + CRSDH_document_header int NOT NULL, + CRSDH_conversation_ID int NOT NULL, + CRSDH_source tinyint NOT NULL, + CRSDH_creation_date datetime2 NOT NULL, + CRSDH_source_reference varchar(255) NULL, + CRSDH_rowguid uniqueidentifier NOT NULL DEFAULT (newsequentialid()), + CRSDH_pharmacy_code char(6) NOT NULL DEFAULT (''@phcode@''), + CONSTRAINT PK_CRS_document_header PRIMARY KEY NONCLUSTERED (CRS_document_header_ID), + CONSTRAINT CK_CRS_document_header_pharmacy_code CHECK ([CRSDH_pharmacy_code]=''@phcode@'') +); + +IF EXISTS (SELECT 1 FROM sys.tables WHERE name = ''DH_Criteria'' AND schema_id = SCHEMA_ID(''@dbo@'')) + DROP TABLE @dbo@.DH_Criteria; + +IF NOT EXISTS (SELECT 1 FROM sys.tables WHERE name = ''DH_Criteria'' AND schema_id = SCHEMA_ID(''@dbo@'')) +CREATE TABLE @dbo@.DH_Criteria ( + DH_criteria_ID int NOT NULL, + DHCR_document_header int NOT NULL, + DHCR_criteria int NOT NULL, + DHCR_remark varchar(255) NULL, + DHCR_TS timestamp NOT NULL, + DHCR_VGUID varchar(36) NULL DEFAULT (newid()), + DHCR_master_ID varchar(60) NULL, + DHCR_rowguid uniqueidentifier NOT NULL DEFAULT (newsequentialid()), + DHCR_pharmacy_code char(6) NOT NULL DEFAULT (''@phcode@''), + CONSTRAINT PK_DH_Criteria PRIMARY KEY NONCLUSTERED (DH_criteria_ID), + CONSTRAINT CK_DH_Criteria_pharmacy_code CHECK ([DHCR_pharmacy_code]=''@phcode@'') +); + +IF EXISTS (SELECT 1 FROM sys.tables WHERE name = ''Document_date'' AND schema_id = SCHEMA_ID(''@dbo@'')) + DROP TABLE @dbo@.Document_date; + +IF NOT EXISTS (SELECT 1 FROM sys.tables WHERE name = ''Document_date'' AND schema_id = SCHEMA_ID(''@dbo@'')) +CREATE TABLE @dbo@.Document_date ( + Document_date_ID int NOT NULL, + DD_batch_run int NULL, + DD_document_header int NOT NULL, + DD_insurance_bill_to int NULL, + DD_date datetime NOT NULL, + DD_real_date datetime NULL, + DD_preparation_date datetime NULL, + DD_promised_date datetime NULL, + DD_element_requirement_date datetime NULL, + DD_amount decimal NULL, + DD_type smallint NOT NULL, + DD_label varchar(60) NULL, + DD_mandatory bit NOT NULL DEFAULT ((0)), + DD_percentage decimal NULL, + DD_reminder_level smallint NULL, + DD_delivery_type smallint NULL, + DD_tracking_number varchar(30) NULL, + DD_error_list varchar(255) NULL, + DD_remark varchar(max) NULL, + DD_VGUID varchar(36) NULL DEFAULT (newid()), + DD_master_ID varchar(60) NULL, + DD_TS timestamp NOT NULL, + DD_PH_insurance_plan uniqueidentifier NULL, + DD_rowguid uniqueidentifier NOT NULL DEFAULT (newsequentialid()), + DD_pharmacy_code char(6) NOT NULL DEFAULT (''@phcode@''), + CONSTRAINT PK_Document_date PRIMARY KEY NONCLUSTERED (Document_date_ID), + CONSTRAINT CK_Document_date_pharmacy_code CHECK ([DD_pharmacy_code]=''@phcode@'') +); + +IF EXISTS (SELECT 1 FROM sys.tables WHERE name = ''Document_header'' AND schema_id = SCHEMA_ID(''@dbo@'')) + DROP TABLE @dbo@.Document_header; + +IF NOT EXISTS (SELECT 1 FROM sys.tables WHERE name = ''Document_header'' AND schema_id = SCHEMA_ID(''@dbo@'')) +CREATE TABLE @dbo@.Document_header ( + Document_header_ID int NOT NULL, + DH_subsidiary int NOT NULL, + DH_address_contact_person_list int NULL, + DH_VAT_period int NULL, + DH_language int NULL, + DH_default_task int NULL, + DH_invoicing_method int NULL, + DH_payment_method int NULL, + DH_source_financial_relation int NULL, + DH_financial_relation_account int NULL, + DH_shipping_method int NULL, + DH_work_order int NULL, + DH_journal int NULL, + DH_default_accounting_period int NULL, + DH_bmc_user_profile int NULL, + DH_currency int NULL, + DH_delivery_code int NULL, + DH_payment_terms int NULL, + DH_predefined_entry int NOT NULL, + DH_account int NULL, + DH_sold_to int NOT NULL, + DH_ship_to int NOT NULL, + DH_bill_to int NOT NULL, + DH_send_bill_to int NOT NULL, + DH_add_turnover_to int NOT NULL, + DH_freight_forwarder int NULL, + DH_def_PCEM int NULL, + DH_def_inventory_site int NULL, + DH_def_inventory_location int NULL, + DH_def_sales_representative int NULL, + DH_vehicle int NULL, + DH_time_period int NULL, + DH_printed_copies smallint NOT NULL DEFAULT (0), + DH_copies smallint NOT NULL DEFAULT (0), + DH_originals smallint NOT NULL DEFAULT (0), + DH_reminder_level smallint NOT NULL DEFAULT (0), + DH_label varchar(30) NULL, + DH_ship_to_text varchar(255) NULL, + DH_sold_to_text varchar(255) NULL, + DH_send_bill_to_text varchar(255) NULL, + DH_our_ref varchar(255) NULL, + DH_your_ref varchar(255) NULL, + DH_reference varchar(255) NULL, + DH_doc_number varchar(15) NULL, + DH_accounting_number int NULL, + DH_batch_number int NULL, + DH_archive_number varchar(60) NULL, + DH_accounting_status smallint NOT NULL DEFAULT (1), + DH_open_item bit NOT NULL DEFAULT (0), + DH_doc_date datetime NOT NULL, + DH_value_date datetime NOT NULL, + DH_input_date datetime NULL, + DH_delivery_date datetime NULL, + DH_due_date_basis datetime NULL, + DH_management_value_date datetime NULL, + DH_dealt_by varchar(60) NULL, + DH_remark varchar(max) NULL, + DH_version smallint NOT NULL DEFAULT (0), + DH_status smallint NOT NULL, + DH_state smallint NOT NULL DEFAULT (1), + DH_print_code smallint NOT NULL, + DH_tax_calculated bit NOT NULL DEFAULT (0), + DH_exchange_rate float NULL DEFAULT (1), + DH_BVR_reference varchar(30) NULL, + DH_BVR_original_line varchar(255) NULL, + DH_invoice_group varchar(30) NULL, + DH_TS timestamp NOT NULL, + DH_organizational_unit int NULL, + DH_IPI_reference varchar(60) NULL, + DH_bank_fees_settlement smallint NULL, + DH_cash_status smallint NULL, + DH_inventory_interface smallint NULL, + DH_accounting_interface smallint NULL, + DH_VGUID varchar(36) NULL DEFAULT (newid()), + DH_inventory_status smallint NULL, + DH_master_ID varchar(60) NULL, + DH_allocation_status smallint NULL, + DH_ALT_type smallint NULL, + DH_bonus_points decimal NULL, + DH_IOU_signature_status smallint NULL, + DH_IOU_signature_unlock_code varchar(255) NULL, + DH_external_doc_number varchar(30) NULL, + DH_VIP_card_barcode varchar(30) NULL, + DH_transitory_PERM int NULL, + DH_transitory_start_date datetime NULL, + DH_robot_batch_number varchar(60) NULL, + DH_prescription_control_status smallint NULL, + DH_prescription_control_status_date datetime NULL, + DH_multi_basket_GUID uniqueidentifier NULL, + DH_employee_card_number nvarchar(15) NULL, + DH_rowguid uniqueidentifier NOT NULL DEFAULT (newsequentialid()), + DH_pharmacy_code char(6) NOT NULL DEFAULT (''@phcode@''), + CONSTRAINT PK_Document_header PRIMARY KEY NONCLUSTERED (Document_header_ID), + CONSTRAINT CK_Document_header_pharmacy_code CHECK ([DH_pharmacy_code]=''@phcode@'') +); + +'; + +DECLARE @trg TABLE( + id INT IDENTITY NOT NULL PRIMARY KEY, + phcode VARCHAR(6) NOT NULL, + sch VARCHAR(20) NOT NULL +); + +--list of pharmacies and phcy_code to handle +INSERT INTO @trg ( + [phcode], + [sch] +) +VALUES ('gam091','ama091_dbo') + ,('gam251', 'ama251_dbo') + ,('gam511', 'ama511_dbo') +; + +DECLARE @phcode VARCHAR(6), @sch VARCHAR(20); +/* declare variables */ +DECLARE @q NVARCHAR(MAX) + +DECLARE csr_schema CURSOR FAST_FORWARD READ_ONLY FOR + SELECT [t].[phcode], [t].[sch] + FROM @trg AS [t]; + +OPEN csr_schema + +FETCH NEXT FROM csr_schema INTO @phcode, @sch + +WHILE @@FETCH_STATUS = 0 +BEGIN + SET @q = REPLACE(REPLACE(@tpl, '@dbo@', @sch), '@phcode@', @phcode) + + --PRINT @q + EXEC [sys].[sp_executesql] + @q + ,N'' + ; + FETCH NEXT FROM csr_schema INTO @phcode, @sch +END + +CLOSE csr_schema +DEALLOCATE csr_schema \ No newline at end of file diff --git a/DEV - Script a job and shcedules.sql b/DEV - Script a job and shcedules.sql new file mode 100644 index 0000000..3b6e4f0 --- /dev/null +++ b/DEV - Script a job and shcedules.sql @@ -0,0 +1,338 @@ +/* SYSJOBS */ +DECLARE @job_id UNIQUEIDENTIFIER = NULL, + @name NVARCHAR(128) = NULL, + @enabled TINYINT = 1, + @description NVARCHAR(512) = NULL, + @start_step_id INT = 1, + @category_id INT, + @owner_sid VARBINARY(85) = NULL, + @notify_level_eventlog INT = 0, + @notify_level_email INT = 0, + @notify_level_netsend INT = 0, + @notify_level_page INT = 0, + @delete_level INT = 0, + @categoryname NVARCHAR(128) = NULL, + @categorytype VARCHAR(12) = NULL, + @categoryclass INT, + @loginname NVARCHAR(128) = NULL, +/* NOT USED FOR NOW */ + @notify_email_operator_id INT = 0, + @notify_netsend_operator_id INT = 0, + @notify_page_operator_id INT = 0, +/* SYSJOBSTEP */ + @step_id INT = NULL, + @step_name NVARCHAR(128), + @subsystem NVARCHAR(40), + @command NVARCHAR(MAX) = NULL, + @flags INT, + @additional_parameters NVARCHAR(MAX) = NULL, + @cmdexec_success_code INT = 0, + @on_success_action TINYINT, + @on_success_step_id INT = 0, + @on_fail_action TINYINT, + @on_fail_step_id INT = 0, + @server NVARCHAR(128) = NULL, + @database_name NVARCHAR(128) = NULL, + @database_user_name NVARCHAR(128) = NULL, + @retry_attempts INT = 0, + @retry_interval INT = 0, + @os_run_priority INT, + @output_file_name NVARCHAR(200) = NULL, + @last_run_outcome INT, + @last_run_duration INT, + @last_run_retries INT, + @last_run_date INT, + @last_run_time INT, + @proxy_id INT = NULL, + @proxyname NVARCHAR(128) = NULL, + @cmd VARCHAR(MAX), + @path VARCHAR(200), +/* SYSSCHEDULES */ + @freq_type INT, + @freq_interval INT, + @freq_subday_type INT, + @freq_subday_interval INT, + @freq_relative_interval INT, + @freq_recurrence_factor INT, + @active_start_date INT, + @active_end_date INT, + @active_start_time INT, + @active_end_time INT, +/* CUSTOM */ + @code_job NVARCHAR(10) = NULL + + DECLARE c_jobs CURSOR LOCAL FORWARD_ONLY STATIC FOR + SELECT sj.job_id,sj.name, sj.[enabled], sj.[description], sj.start_step_id, sj.category_id, sj.owner_sid, sj.notify_level_eventlog, sj.notify_level_email, sj.notify_level_netsend, sj.notify_level_page, sj.notify_email_operator_id, sj.notify_netsend_operator_id, sj.notify_page_operator_id, sj.delete_level + FROM msdb.dbo.sysjobs sj + JOIN msdb.dbo.[syscategories] sc ON sc.[category_id] = sj.[category_id] +WHERE 1=1 + AND LOWER(sj.name) NOT LIKE '%distribution%' + AND LOWER(sj.name) NOT LIKE '%subscription%' + AND LOWER(sj.name) NOT LIKE '%replication%' + AND LOWER(sj.name) NOT LIKE '%ActivePos_read-%' + AND sj.name LIKE '%-%' + AND sc.[name] NOT LIKE '%REPL%' + and sj.name = 'ZZ - TSC - check connectivity to replinibackup share' + ORDER BY sj.name + + +OPEN c_jobs + +FETCH NEXT FROM c_jobs + INTO @job_id, @name, @enabled, @description, @start_step_id, @category_id, @owner_sid, @notify_level_eventlog, @notify_level_email, @notify_level_netsend, @notify_level_page, @notify_email_operator_id, @notify_netsend_operator_id, @notify_page_operator_id, @delete_level + +WHILE @@fetch_status = 0 +BEGIN + + SET @path = 'U:\'+@name+'.sql' + + DECLARE @cleanCmd VARCHAR(8000)= 'del "'+@path+'"'; + DECLARE @catchOutput TABLE(output VARCHAR(max)); + + INSERT INTO @catchOutput ([output]) + EXEC [sys].[xp_cmdshell] @cleanCmd; + + EXEC HCITools.dbo.aps_File_Delete @path = @path; -- nvarchar(max) + + + SET @code_job = SUBSTRING(@name,0,CHARINDEX('-',@name,0)-1) + + SET @cmd = '/* Drop existing standard schedule for job */'+CHAR(13)+CHAR(10)+ + 'declare @schedule_id int'+CHAR(13)+CHAR(10)+ + 'declare c_schedules cursor local forward_only static for'+CHAR(13)+CHAR(10)+ + ' select ss.schedule_id'+CHAR(13)+CHAR(10)+ + ' from msdb.dbo.sysjobschedules sjs'+CHAR(13)+CHAR(10)+ + 'INNER JOIN msdb.dbo.sysschedules ss'+CHAR(13)+CHAR(10)+ + ' ON sjs.schedule_id = ss.schedule_id'+CHAR(13)+CHAR(10)+ + ' AND ss.name NOT LIKE ''%#SPEC#'''+CHAR(13)+CHAR(10)+ + 'INNER JOIN msdb.dbo.sysjobs sj'+CHAR(13)+CHAR(10)+ + ' ON sjs.job_id = sj.job_id'+CHAR(13)+CHAR(10)+ + ' WHERE sj.name = N'''+REPLACE(@name,'''','''''')+''''+CHAR(13)+CHAR(10)+CHAR(13)+CHAR(10)+ + 'open c_schedules'+CHAR(13)+CHAR(10)+CHAR(13)+CHAR(10)+ + 'FETCH NEXT FROM c_schedules into @schedule_id'+CHAR(13)+CHAR(10)+ + 'while @@fetch_status = 0'+CHAR(13)+CHAR(10)+ + 'begin'+CHAR(13)+CHAR(10)+ + ' IF ((select COUNT(*) from msdb.dbo.sysjobschedules where schedule_id=@schedule_id) = 1)'+CHAR(13)+CHAR(10)+ + ' EXEC msdb.dbo.sp_delete_schedule @schedule_id=@schedule_id, @force_delete = 1'+CHAR(13)+CHAR(10)+ + 'FETCH NEXT FROM c_schedules into @schedule_id'+CHAR(13)+CHAR(10)+ + 'end'+CHAR(13)+CHAR(10)+CHAR(13)+CHAR(10)+ + 'close c_schedules'+CHAR(13)+CHAR(10)+CHAR(13)+CHAR(10)+ + 'deallocate c_schedules'+CHAR(13)+CHAR(10)+CHAR(13)+CHAR(10)+ + 'IF EXISTS (SELECT job_id FROM msdb.dbo.sysjobs_view WHERE name = N'''+REPLACE(@name,'''','''''')+''')'+CHAR(13)+CHAR(10)+ + 'EXEC msdb.dbo.sp_delete_job @job_name = N'''+REPLACE(@name,'''','''''')+''', @delete_unused_schedule=0'+CHAR(13)+CHAR(10)+ + 'GO'+CHAR(13)+CHAR(10)+CHAR(13)+CHAR(10)+ + '/* Creation Job and Steps*/'+CHAR(13)+CHAR(10)+ + 'BEGIN TRANSACTION'+CHAR(13)+CHAR(10)+ + 'DECLARE @ReturnCode INT'+CHAR(13)+CHAR(10)+ + 'SELECT @ReturnCode = 0'+CHAR(13)+CHAR(10)+CHAR(13)+CHAR(10) + + EXEC HCITools.[dbo].[aps_File_Write_Text] @data = @cmd, @path = @path,@append = 1, @encoding = 'utf-16' + + SET @categoryname = NULL + SET @categoryclass = 1 + SET @categorytype = 'LOCAL' + + SELECT @categoryname = name,@categoryclass = category_class, @categorytype = CASE category_type + WHEN 1 THEN 'LOCAL' + WHEN 2 THEN 'MULTI-SERVER' + WHEN 3 THEN 'NONE' END + FROM msdb.dbo.syscategories WHERE category_id = @category_id + + SET @loginname = NULL + + SELECT @loginname = name FROM sys.syslogins WHERE sid = @owner_sid + + /* + , @notify_level_eventlog = + , @notify_level_email = + , @notify_level_netsend = + , @notify_level_page = + , @notify_email_operator_name = + , @notify_netsend_operator_name = + , @notify_page_operator_name = + + */ + + + SET @cmd = 'IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'''+REPLACE(@categoryname,'''','''''')+''' AND category_class='+CAST(@categoryclass AS VARCHAR(1))+')'+CHAR(13)+CHAR(10)+ + 'BEGIN'+CHAR(13)+CHAR(10)+ + 'EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N''JOB'', @type=N'''+ @categorytype +''', @name=N'''+REPLACE(@categoryname,'''','''''')+''''+CHAR(13)+CHAR(10)+ + 'IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback'+CHAR(13)+CHAR(10)+CHAR(13)+CHAR(10)+ + 'END'+CHAR(13)+CHAR(10)+CHAR(13)+CHAR(10)+ + '/* Add Job */'+CHAR(13)+CHAR(10)+ + 'DECLARE @jobId BINARY(16)'+CHAR(13)+CHAR(10)+ + 'EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'''+REPLACE(@name,'''','''''')+''', '+CHAR(13)+CHAR(10)+CHAR(9)+CHAR(9)+ + '@enabled=' +CAST(@enabled AS VARCHAR(1)) +', '+CHAR(13)+CHAR(10)+CHAR(9)+CHAR(9)+ + '@notify_level_eventlog=' +CAST(@notify_level_eventlog AS VARCHAR(1)) +', '+CHAR(13)+CHAR(10)+CHAR(9)+CHAR(9)+ + '@notify_level_email=' +CAST(@notify_level_email AS VARCHAR(1)) +', '+CHAR(13)+CHAR(10)+CHAR(9)+CHAR(9)+ + '@notify_level_netsend=' +CAST(@notify_level_netsend AS VARCHAR(1)) +', '+CHAR(13)+CHAR(10)+CHAR(9)+CHAR(9)+ + '@notify_level_page=' +CAST(@notify_level_page AS VARCHAR(1)) +', '+CHAR(13)+CHAR(10)+CHAR(9)+CHAR(9)+ + '@delete_level='+CAST(@delete_level AS VARCHAR(2))+', '+CHAR(13)+CHAR(10)+CHAR(9)+CHAR(9) + + EXEC HCITools.[dbo].[aps_File_Write_Text] @data = @cmd, @path = @path,@append = 1, @encoding = 'utf-16' + + SET @cmd = '@description='+ISNULL('N'''+REPLACE(@description,'''','''''')+'''','NULL')+', '+CHAR(13)+CHAR(10)+CHAR(9)+CHAR(9) + + EXEC HCITools.[dbo].[aps_File_Write_Text] @data = @cmd, @path = @path,@append = 1, @encoding = 'utf-16' + + SET @cmd = '@category_name=N'''+@categoryname+''', '+CHAR(13)+CHAR(10)+CHAR(9)+CHAR(9)+ + '@start_step_id='+CAST(@start_step_id AS VARCHAR(3))+', '+CHAR(13)+CHAR(10)+CHAR(9)+CHAR(9)+ + '@owner_login_name=N'''+@loginname+''', @job_id = @jobId OUTPUT'+CHAR(13)+CHAR(10)+ + 'IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback'+CHAR(13)+CHAR(10)+CHAR(13)+CHAR(10) + + EXEC HCITools.[dbo].[aps_File_Write_Text] @data = @cmd, @path = @path,@append = 1, @encoding = 'utf-16' + + DECLARE c_jobstep CURSOR LOCAL FORWARD_ONLY STATIC FOR + SELECT step_id, step_name, subsystem, command, flags, additional_parameters, cmdexec_success_code, on_success_action, on_success_step_id, on_fail_action, on_fail_step_id, [server], database_name, database_user_name, retry_attempts, retry_interval, os_run_priority, output_file_name, last_run_outcome, proxy_id + FROM msdb.dbo.sysjobsteps + WHERE job_id = @job_id + ORDER BY step_id + + OPEN c_jobstep + + FETCH NEXT FROM c_jobstep + INTO @step_id, @step_name, @subsystem, @command, @flags, @additional_parameters, @cmdexec_success_code, @on_success_action, @on_success_step_id, @on_fail_action, @on_fail_step_id, @server, @database_name, @database_user_name, @retry_attempts, @retry_interval, @os_run_priority, @output_file_name, @last_run_outcome, @proxy_id + + WHILE @@fetch_status = 0 + BEGIN + + SET @proxyname = NULL + + SELECT @proxyname = name FROM msdb.dbo.sysproxies WHERE proxy_id = @proxy_id + + SET @cmd = '/* Add Step */'+CHAR(13)+CHAR(10)+ + 'EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'''+REPLACE(@step_name,'''','''''')+''', '+CHAR(13)+CHAR(10)+CHAR(9)+ CHAR(9)+ + '@step_id='+CAST(@step_id AS VARCHAR(3))+', '+CHAR(13)+CHAR(10)+CHAR(9)+CHAR(9)+ + '@cmdexec_success_code='+CAST(@cmdexec_success_code AS VARCHAR(3))+', '+CHAR(13)+CHAR(10)+CHAR(9)+CHAR(9)+ + '@on_success_action='+CAST(@on_success_action AS VARCHAR(3))+', '+CHAR(13)+CHAR(10)+CHAR(9)+CHAR(9)+ + '@on_success_step_id='+CAST(@on_success_step_id AS VARCHAR(3))+', '+CHAR(13)+CHAR(10)+CHAR(9)+CHAR(9)+ + '@on_fail_action='+CAST(@on_fail_action AS VARCHAR(3))+', '+CHAR(13)+CHAR(10)+CHAR(9)+CHAR(9)+ + '@on_fail_step_id='+CAST(@on_fail_step_id AS VARCHAR(3))+', '+CHAR(13)+CHAR(10)+CHAR(9)+CHAR(9)+ + '@retry_attempts='+CAST(@retry_attempts AS VARCHAR(30))+', '+CHAR(13)+CHAR(10)+CHAR(9)+CHAR(9)+ + '@retry_interval='+CAST(@retry_interval AS VARCHAR(3))+', '+CHAR(13)+CHAR(10)+CHAR(9)+CHAR(9)+ + '@os_run_priority='+CAST(@os_run_priority AS VARCHAR(3))+', @subsystem=N'''+@subsystem+''', '+CHAR(13)+CHAR(10)+CHAR(9)+CHAR(9) + + EXEC HCITools.[dbo].[aps_File_Write_Text] @data = @cmd, @path = @path,@append = 1, @encoding = 'utf-16' + + SET @cmd = '@command='+ISNULL('N'''+REPLACE(@command,'''','''''')+'''','NULL')+', '+CHAR(13)+CHAR(10)+CHAR(9)+CHAR(9) + + EXEC HCITools.[dbo].[aps_File_Write_Text] @data = @cmd, @path = @path,@append = 1, @encoding = 'utf-16' + + + SET @cmd = '@database_name='+ISNULL('N'''+@database_name+'''','NULL')+', '+CHAR(13)+CHAR(10)+CHAR(9)+CHAR(9)+ + '@output_file_name='+ISNULL('N'''+@output_file_name+'''','NULL')+', '+CHAR(13)+CHAR(10)+CHAR(9)+CHAR(9)+ + '@flags='+CAST(@flags as varchar(3))+', '+CHAR(13)+CHAR(10)+CHAR(9)+CHAR(9)+ + '@database_user_name='+ISNULL('N'''+@database_user_name+'''','NULL')+', '+CHAR(13)+CHAR(10)+CHAR(9)+CHAR(9)+ + '@server='+ISNULL('N'''+@server+'''','NULL')+', '+CHAR(13)+CHAR(10)+CHAR(9)+CHAR(9) + + EXEC HCITools.[dbo].[aps_File_Write_Text] @data = @cmd, @path = @path,@append = 1, @encoding = 'utf-16' + + SET @cmd = '@additional_parameters='+ISNULL('N'''+@additional_parameters+'''','NULL')+', '+CHAR(13)+CHAR(10)+CHAR(9)+CHAR(9)+ + --'@proxy_id='+ISNULL(CAST(@proxy_id as varchar(50)),'NULL')+', '+CHAR(13)+CHAR(10)+CHAR(9)+CHAR(9)+ + '@proxy_id=NULL, '+CHAR(13)+CHAR(10)+CHAR(9)+CHAR(9)+ + '@proxy_name='+ISNULL('N'''+@proxyname+'''','NULL')+''+CHAR(13)+CHAR(10)+ + 'IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback'+CHAR(13)+CHAR(10) + + EXEC HCITools.[dbo].[aps_File_Write_Text] @data = @cmd, @path = @path,@append = 1, @encoding = 'utf-16' + + FETCH NEXT FROM c_jobstep + into @step_id, @step_name, @subsystem, @command, @flags, @additional_parameters, @cmdexec_success_code, @on_success_action, @on_success_step_id, @on_fail_action, @on_fail_step_id, @server, @database_name, @database_user_name, @retry_attempts, @retry_interval, @os_run_priority, @output_file_name, @last_run_outcome, @proxy_id + end + + close c_jobstep + + deallocate c_jobstep + + SET @cmd = 'EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = '+CAST(@start_step_id as varchar(3))+CHAR(13)+CHAR(10)+ + 'IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback'+CHAR(13)+CHAR(10)+CHAR(13)+CHAR(10) + + EXEC HCITools.[dbo].[aps_File_Write_Text] @data = @cmd, @path = @path,@append = 1, @encoding = 'utf-16' + + declare c_schedules cursor local forward_only static for + select name,[enabled],freq_type,freq_interval,freq_subday_type,freq_subday_interval,freq_relative_interval,freq_recurrence_factor,active_start_date,active_end_date,active_start_time,active_end_time + from msdb.dbo.sysjobschedules sjs + INNER JOIN msdb.dbo.sysschedules ss + ON sjs.job_id = @job_id + AND sjs.schedule_id = ss.schedule_id + AND ss.name NOT LIKE '%#SPEC#' + AND ss.name LIKE @code_job+'%' + + open c_schedules + + FETCH NEXT FROM c_schedules + into @name,@enabled, @freq_type, @freq_interval, @freq_subday_type, @freq_subday_interval, @freq_relative_interval, @freq_recurrence_factor, @active_start_date, @active_end_date, @active_start_time, @active_end_time + + while @@fetch_status = 0 + begin + + SET @cmd = '/* Add Standard Schedule */'+CHAR(13)+CHAR(10)+ + 'EXEC @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id=@jobId, @name=N'''+REPLACE(@name,'''','''''')+''', '+CHAR(13)+CHAR(10)+CHAR(9)+CHAR(9)+ + '@enabled=' +CAST(@enabled as varchar(1)) +', '+CHAR(13)+CHAR(10)+CHAR(9)+CHAR(9)+ + '@freq_type=' +CAST(@freq_type as varchar(3)) +', '+CHAR(13)+CHAR(10)+CHAR(9)+CHAR(9)+ + '@freq_interval=' +CAST(@freq_interval as varchar(3)) +', '+CHAR(13)+CHAR(10)+CHAR(9)+CHAR(9)+ + '@freq_subday_type=' +CAST(@freq_subday_type as varchar(1)) +', '+CHAR(13)+CHAR(10)+CHAR(9)+CHAR(9)+ + '@freq_subday_interval=' +CAST(@freq_subday_interval as varchar(2)) +', '+CHAR(13)+CHAR(10)+CHAR(9)+CHAR(9)+ + '@freq_relative_interval=' +CAST(@freq_relative_interval as varchar(2)) +', '+CHAR(13)+CHAR(10)+CHAR(9)+CHAR(9)+ + '@freq_recurrence_factor=' +CAST(@freq_recurrence_factor as varchar(2)) +', '+CHAR(13)+CHAR(10)+CHAR(9)+CHAR(9)+ + '@active_start_date=' +CAST(@active_start_date as varchar(8)) +', '+CHAR(13)+CHAR(10)+CHAR(9)+CHAR(9)+ + '@active_end_date=' +CAST(@active_end_date as varchar(8)) +', '+CHAR(13)+CHAR(10)+CHAR(9)+CHAR(9)+ + '@active_start_time=' +CAST(@active_start_time as varchar(6)) +', '+CHAR(13)+CHAR(10)+CHAR(9)+CHAR(9)+ + '@active_end_time=' +CAST(@active_end_time as varchar(6)) +''+CHAR(13)+CHAR(10)+ + 'IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback'+CHAR(13)+CHAR(10)+CHAR(13)+CHAR(10) + + EXEC HCITools.[dbo].[aps_File_Write_Text] @data = @cmd, @path = @path,@append = 1, @encoding = 'utf-16' + + FETCH NEXT FROM c_schedules + into @name,@enabled, @freq_type, @freq_interval, @freq_subday_type, @freq_subday_interval, @freq_relative_interval, @freq_recurrence_factor, @active_start_date, @active_end_date, @active_start_time, @active_end_time + end + + close c_schedules + + deallocate c_schedules + + SET @cmd = '/* Attach existing specific schedule for job */'+CHAR(13)+CHAR(10)+ + 'declare @enabled_schedule int,'+CHAR(13)+CHAR(10)+ + ' @schedule_name nvarchar(50)'+CHAR(13)+CHAR(10)+ + 'declare c_schedules cursor local forward_only static for'+CHAR(13)+CHAR(10)+ + 'select enabled, name'+CHAR(13)+CHAR(10)+ + ' from msdb.dbo.sysschedules'+CHAR(13)+CHAR(10)+ + ' where name LIKE '''+@code_job+'%'''+CHAR(13)+CHAR(10)+ + ' and name LIKE ''%#SPEC#'''+CHAR(13)+CHAR(10)+CHAR(13)+CHAR(10)+ + 'open c_schedules'+CHAR(13)+CHAR(10)+CHAR(13)+CHAR(10)+ + 'FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name'+CHAR(13)+CHAR(10)+ + 'while @@fetch_status = 0'+CHAR(13)+CHAR(10)+ + 'begin'+CHAR(13)+CHAR(10)+ + ' EXEC @ReturnCode = msdb.dbo.sp_attach_schedule @job_id = @jobId, @schedule_name=@schedule_name'+CHAR(13)+CHAR(10)+ + ' IF(@enabled_schedule = 1)'+CHAR(13)+CHAR(10)+ + ' begin'+CHAR(13)+CHAR(10)+ + ' SET @schedule_name = SUBSTRING(@schedule_name,0,LEN(@schedule_name)-5)'+CHAR(13)+CHAR(10)+ + ' IF EXISTS (select name from msdb.dbo.sysschedules where name = @schedule_name)'+CHAR(13)+CHAR(10)+ + ' EXEC @ReturnCode = msdb.dbo.sp_update_schedule @name=@schedule_name, @enabled=0'+CHAR(13)+CHAR(10)+ + ' end'+CHAR(13)+CHAR(10)+ + ' IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback'+CHAR(13)+CHAR(10)+ + 'FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name'+CHAR(13)+CHAR(10)+ + 'end'+CHAR(13)+CHAR(10)+CHAR(13)+CHAR(10)+ + 'close c_schedules'+CHAR(13)+CHAR(10)+CHAR(13)+CHAR(10)+ + 'deallocate c_schedules'+CHAR(13)+CHAR(10)+CHAR(13)+CHAR(10) + + EXEC HCITools.[dbo].[aps_File_Write_Text] @data = @cmd, @path = @path,@append = 1, @encoding = 'utf-16' + + SET @cmd = 'EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N''(local)'''+CHAR(13)+CHAR(10)+ + 'IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback'+CHAR(13)+CHAR(10)+ + 'COMMIT TRANSACTION'+CHAR(13)+CHAR(10)+ + 'GOTO EndSave'+CHAR(13)+CHAR(10)+ + 'QuitWithRollback:'+CHAR(13)+CHAR(10)+ + ' IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION'+CHAR(13)+CHAR(10)+ + 'EndSave:'+CHAR(13)+CHAR(10)+CHAR(13)+CHAR(10)+ + 'GO'+CHAR(13)+CHAR(10) + + EXEC HCITools.[dbo].[aps_File_Write_Text] @data = @cmd, @path = @path,@append = 1, @encoding = 'utf-16' + + FETCH NEXT FROM c_jobs + into @job_id, @name, @enabled, @description, @start_step_id, @category_id, @owner_sid, @notify_level_eventlog, @notify_level_email, @notify_level_netsend, @notify_level_page, @notify_email_operator_id, @notify_netsend_operator_id, @notify_page_operator_id, @delete_level + +end + +close c_jobs + +deallocate c_jobs diff --git a/DEV - script grants and roles for all logins in a db.sql b/DEV - script grants and roles for all logins in a db.sql index 7a3cc0b..059d005 100644 --- a/DEV - script grants and roles for all logins in a db.sql +++ b/DEV - script grants and roles for all logins in a db.sql @@ -1,128 +1,21 @@ -USE [master] -/* declare variables */ -DECLARE @db VARCHAR(100) -IF OBJECT_ID('tempdb..#txt')IS NOT NULL BEGIN; - DROP TABLE #txt; -END; - -CREATE TABLE #txt( - id INT NOT NULL IDENTITY - ,db VARCHAR(100) NOT NULL - ,msg NVARCHAR(MAX) NULL -); - -DECLARE csr_db CURSOR FAST_FORWARD READ_ONLY FOR - SELECT d.name - FROM sys.databases d - WHERE d.[database_id]>4 - AND d.[is_read_only] = 0 - AND d.[state]=0 - -OPEN csr_db - -FETCH NEXT FROM csr_db INTO @db - -WHILE @@FETCH_STATUS = 0 -BEGIN - EXEC(' - use '+@db+'; - --- Script to generate user creation and role membership -DECLARE @UserScripts NVARCHAR(MAX) = ''''; -DECLARE @RoleScripts NVARCHAR(MAX) = ''''; -DECLARE @login NVARCHAR(MAX) = ''medicalData-importer-int''; ---SET @login=null; - --- Generate user creation scripts -SELECT @UserScripts = @UserScripts + ''CREATE USER ['' + dp.name + ''] FOR LOGIN ['' + dp.name + ''];'' + CHAR(13) + CHAR(10) -FROM sys.database_principals dp -WHERE dp.type IN (''S'', ''U'', ''G'') -AND dp.name NOT IN (''dbo'', ''guest'', ''INFORMATION_SCHEMA'', ''sys'') -AND dp.name = COALESCE(@login, dp.[name]); - --- Generate role membership scripts -SELECT @RoleScripts = @RoleScripts + ''ALTER ROLE ['' + dr.name + ''] ADD MEMBER ['' + dp.name + ''];'' + CHAR(13) + CHAR(10) -FROM sys.database_principals dp -JOIN sys.database_role_members drm ON dp.principal_id = drm.member_principal_id -JOIN sys.database_principals dr ON drm.role_principal_id = dr.principal_id -WHERE dp.type IN (''S'', ''U'', ''G'') -AND dp.name NOT IN (''dbo'', ''guest'', ''INFORMATION_SCHEMA'', ''sys'') -AND dp.name = COALESCE(@login, dp.[name]); - --- Print user creation and role membership scripts -PRINT @UserScripts; -insert into #txt(db,msg) -select '''+@db+''',@UserScripts -where nullif(@UserScripts,'''') is not null; - -PRINT @RoleScripts; -insert into #txt(db,msg) -select '''+@db+''',@RoleScripts -where nullif(@RoleScripts,'''') is not null; - --- Script to generate permissions -DECLARE @PermissionScripts NVARCHAR(MAX) = ''''; - -SELECT @PermissionScripts = @PermissionScripts + - CASE - WHEN p.state_desc = ''GRANT'' THEN ''GRANT '' - WHEN p.state_desc = ''DENY'' THEN ''DENY '' - WHEN p.state_desc = ''REVOKE'' THEN ''REVOKE '' - END + p.permission_name + - CASE - WHEN p.class_desc = ''OBJECT_OR_COLUMN'' THEN '' ON ['' + OBJECT_NAME(p.major_id) + '']'' - WHEN p.class_desc = ''DATABASE'' THEN '' ON DATABASE::['' + DB_NAME() + '']'' - WHEN p.class_desc = ''SCHEMA'' THEN '' ON SCHEMA::['' + SCHEMA_NAME(p.major_id) + '']'' - WHEN p.class_desc = ''TYPE'' THEN '' ON TYPE::['' + TYPE_NAME(p.major_id) + '']'' - ELSE '''' - END + '' TO ['' + dp.name + ''];'' + CHAR(13) + CHAR(10) -FROM sys.database_permissions p -JOIN sys.database_principals dp ON p.grantee_principal_id = dp.principal_id -WHERE dp.type IN (''S'', ''U'', ''G'') -AND dp.name NOT IN (''dbo'', ''guest'', ''INFORMATION_SCHEMA'', ''sys'') -AND dp.name = COALESCE(@login, dp.[name]); - --- Print permissions scripts -PRINT @PermissionScripts; -insert into #txt(db,msg) -select '''+@db+''',@PermissionScripts -where nullif(@PermissionScripts,'''') is not null; - '); - - FETCH NEXT FROM csr_db INTO @db -END - -CLOSE csr_db -DEALLOCATE csr_db - -SELECT * -FROM [#txt] - -RETURN - - +USE SL2007 --USE dba -- Script to generate user creation and role membership DECLARE @UserScripts NVARCHAR(MAX) = ''; DECLARE @RoleScripts NVARCHAR(MAX) = ''; -DECLARE @login NVARCHAR(MAX) = 'medicalData-importer-dev'; -- Generate user creation scripts SELECT @UserScripts = @UserScripts + 'CREATE USER [' + dp.name + '] FOR LOGIN [' + dp.name + '];' + CHAR(13) + CHAR(10) FROM sys.database_principals dp -WHERE dp.type IN ('S', 'U', 'G') -AND dp.name NOT IN ('dbo', 'guest', 'INFORMATION_SCHEMA', 'sys') -AND dp.name = COALESCE(@login, dp.[name]); +WHERE dp.type IN ('S', 'U', 'G') AND dp.name NOT IN ('dbo', 'guest', 'INFORMATION_SCHEMA', 'sys'); -- Generate role membership scripts SELECT @RoleScripts = @RoleScripts + 'ALTER ROLE [' + dr.name + '] ADD MEMBER [' + dp.name + '];' + CHAR(13) + CHAR(10) FROM sys.database_principals dp JOIN sys.database_role_members drm ON dp.principal_id = drm.member_principal_id JOIN sys.database_principals dr ON drm.role_principal_id = dr.principal_id -WHERE dp.type IN ('S', 'U', 'G') -AND dp.name NOT IN ('dbo', 'guest', 'INFORMATION_SCHEMA', 'sys') -AND dp.name = COALESCE(@login, dp.[name]); +WHERE dp.type IN ('S', 'U', 'G') AND dp.name NOT IN ('dbo', 'guest', 'INFORMATION_SCHEMA', 'sys'); -- Print user creation and role membership scripts PRINT @UserScripts; @@ -146,9 +39,7 @@ SELECT @PermissionScripts = @PermissionScripts + END + ' TO [' + dp.name + '];' + CHAR(13) + CHAR(10) FROM sys.database_permissions p JOIN sys.database_principals dp ON p.grantee_principal_id = dp.principal_id -WHERE dp.type IN ('S', 'U', 'G') -AND dp.name NOT IN ('dbo', 'guest', 'INFORMATION_SCHEMA', 'sys') -AND dp.name = COALESCE(@login, dp.[name]); +WHERE dp.type IN ('S', 'U', 'G') AND dp.name NOT IN ('dbo', 'guest', 'INFORMATION_SCHEMA', 'sys'); -- Print permissions scripts -PRINT @PermissionScripts; \ No newline at end of file +PRINT @PermissionScripts; \ No newline at end of file diff --git a/EXPLOIT - check log backup size.sql b/EXPLOIT - check log backup size.sql new file mode 100644 index 0000000..6636a85 --- /dev/null +++ b/EXPLOIT - check log backup size.sql @@ -0,0 +1,17 @@ +SELECT + database_name, + backup_start_date, + backup_finish_date, + CAST(backup_size / 1024.0 / 1024 AS DECIMAL(18, 2)) AS BackupSizeMB, + CASE + WHEN compressed_backup_size IS NOT NULL + THEN CAST(compressed_backup_size / 1024.0 / 1024 AS DECIMAL(18, 2)) + ELSE NULL + END AS CompressedBackupSizeMB +FROM + msdb.dbo.backupset +WHERE + type = 'L' + AND database_name='arizonarep' +ORDER BY + backup_start_date DESC; \ No newline at end of file diff --git a/EXPLOIT - start replication agents that are stopped.sql b/EXPLOIT - start replication agents that are stopped.sql index 2dc6dec..b1c1fc3 100644 --- a/EXPLOIT - start replication agents that are stopped.sql +++ b/EXPLOIT - start replication agents that are stopped.sql @@ -23,6 +23,5 @@ AND NOT EXISTS( IF NULLIF(@q,'') IS NOT NULL BEGIN PRINT @q - select @q EXEC(@q) END \ No newline at end of file diff --git a/check disk usage and db size.sql b/check disk usage and db size.sql new file mode 100644 index 0000000..789ecf9 --- /dev/null +++ b/check disk usage and db size.sql @@ -0,0 +1,134 @@ +--databases space +IF OBJECT_ID('tempdb..#dbs')IS NOT NULL BEGIN; + DROP TABLE #dbs; +END; + +CREATE TABLE #dbs ( [database_name] NVARCHAR(128), [log_size_mb] DECIMAL(18,2), [row_size_mb] DECIMAL(18,2), [total_size_mb] DECIMAL(18,2) ) + +INSERT INTO [#dbs] ([database_name], [log_size_mb], [row_size_mb], [total_size_mb]) +SELECT + database_name = DB_NAME(database_id) + , log_size_mb = CAST(SUM(CASE WHEN f.type_desc = 'LOG' THEN size END) * 8. / 1024 AS DECIMAL(18,2)) + , row_size_mb = CAST(SUM(CASE WHEN type_desc = 'ROWS' THEN size END) * 8. / 1024 AS DECIMAL(18,2)) + , total_size_mb = CAST(SUM(size) * 8. / 1024 AS DECIMAL(18,2)) +FROM sys.master_files F WITH(NOWAIT) +GROUP BY F.database_id +ORDER BY [total_size_mb] DESC + +IF OBJECT_ID('tempdb..#FileSize')IS NOT NULL BEGIN; + DROP TABLE #FileSize; +END; +CREATE TABLE #FileSize( + dbName NVARCHAR(128) NOT NULL, + FileName NVARCHAR(128) NOT NULL, + type_desc NVARCHAR(128) NOT NULL, + CurrentSizeMB DECIMAL(10,2) NOT NULL, + FreeSpaceMB DECIMAL(10,2) NULL +) +INSERT INTO #FileSize(dbName, FileName, type_desc, CurrentSizeMB, FreeSpaceMB) +exec sp_msforeachdb +'use [?]; + SELECT DB_NAME() AS DbName, + name AS FileName, + type_desc, + size/128.0 AS CurrentSizeMB, + size/128.0 - CAST(FILEPROPERTY(name, ''SpaceUsed'') AS INT)/128.0 AS FreeSpaceMB +FROM sys.database_files +WHERE type IN (0,1);'; + +/* +SELECT * +FROM #FileSize +*/ + +SELECT + d.[name] AS dbName + ,f.[physical_name] AS physicalFileName + ,f.[name] AS logicalFileName + --,d2.[log_size_mb] + --,d2.[row_size_mb] + ,'-----' AS separator + ,CAST(f.size * 8.0 / 1024 AS DECIMAL(18,2)) AS fileSizeMB + ,fs.[FreeSpaceMB] AS FreeSpaceInFileMB + ,fs.[CurrentSizeMB] - fs.[FreeSpaceMB] AS SpaceUsedMB + ,CAST((fs.[CurrentSizeMB] - fs.[FreeSpaceMB]) * 100 / (CAST(f.size * 8. / 1024 AS DECIMAL(18,2))) AS NUMERIC(6,2)) AS fileSpaceUsedPercent + ,'-----' AS separator + ,d2.[total_size_mb] AS totalDbSizeMB + ,'USE '+d.name+'; +DBCC SHRINKFILE (N'''+f.[name]+''' , 0, TRUNCATEONLY); +GO + +' AS shrinkData +,'USE '+d.name+'; +DBCC SHRINKFILE (N'''+f.[name]+''' , 1024); +GO + +' AS reorganizeData + ,'USE '+d.name+'; +IF 1024 < '+CAST(CAST(f.size * 8.0 / 1024 AS DECIMAL(18,2)) AS VARCHAR(15))+' --file is above 1Go + AND 95 > '+CAST(CAST((fs.[CurrentSizeMB] - fs.[FreeSpaceMB]) * 100 / (CAST(f.size * 8.0 / 1024 AS DECIMAL(18,2))) AS DECIMAL(6,2))AS VARCHAR(15))+' --and usage below 95% + AND 0 < '+CAST(CAST(fs.[CurrentSizeMB] - fs.[FreeSpaceMB] AS DECIMAL(16,2))AS VARCHAR(15))+' --and data are present +BEGIN + --print ''Reorganize '+d.name+'.'+f.name+' '' + RAISERROR(''Reorganize '+d.name+'.'+f.name+' '',0,0) WITH NOWAIT + + DBCC SHRINKFILE (N'''+f.[name]+''' , '+CAST(CAST(fs.[CurrentSizeMB] - fs.[FreeSpaceMB] + 1024 AS DECIMAL(18,0)) AS VARCHAR(15))+'); + RAISERROR(''Done'',0,0) WITH NOWAIT +END +GO +' AS auto_action +FROM sys.master_files F + JOIN sys.databases d ON d.[database_id] = f.[database_id] + JOIN [#dbs] [d2] ON d2.[database_name] = d.[name] + LEFT JOIN [#FileSize] fs ON fs.[FileName] = f.name AND fs.[dbName] = d.[name] +WHERE f.type_desc IN ( + 'ROWS' --mdf + --,'LOG' +) +--AND f.[physical_name] LIKE 'f%' +--AND d.[is_read_only] = 0 +--AND d.[is_auto_shrink_on] = 0 +--AND d.name='sl2007' +AND d.name NOT IN ( + 'master' + ,'tempdb' + ,'model' + ,'msdb' +) +ORDER BY [d2].[row_size_mb] DESC, d.name DESC, f.name ASC ; + +--free disk space +SELECT + CONVERT(VARCHAR(512), [b].[volume_mount_point]) AS [volume_mount_point], + CONVERT(VARCHAR(512), [b].[logical_volume_name]) AS [logical_volume_name], + CONVERT(DECIMAL(18, 1), ROUND(((SUM(CONVERT(FLOAT, [b].[available_bytes])) / SUM(CONVERT(FLOAT, [b].[total_bytes]))) * 100), 1)) AS [percent_free], + CONVERT(BIGINT, ROUND(((SUM([b].[available_bytes]) / 1024.0) / 1024.0 / 1024.0), 0)) AS [free_gb], + CONVERT(BIGINT, ROUND(((SUM([b].[available_bytes]) / 1024.0) / 1024.0), 0)) AS [free_mb], + CONVERT(BIGINT, ROUND(((SUM([b].[total_bytes]) / 1024.0) / 1024.0 / 1024.0), 0)) AS [total_gb], + CONVERT(BIGINT, ROUND((((SUM([b].[total_bytes] - [b].[available_bytes])) / 1024.0) / 1024.0 / 1024.0), 0)) AS [used_gb], + CONVERT(BIGINT, ROUND(((SUM([b].[total_bytes]) / 1024.0) / 1024.0), 0)) / 100 * 5 / 1024.0 AS [5% space in Go is], + CONVERT(BIGINT, ROUND(((SUM([b].[total_bytes]) / 1024.0) / 1024.0), 0)) / 100 * 10 / 1024.0 AS [10% space in Go is], + CONVERT(BIGINT, ROUND(((SUM([b].[total_bytes]) / 1024.0) / 1024.0), 0)) / 100 * 15 / 1024.0 AS [15% space in Go is], + CURRENT_TIMESTAMP AS now, + REPLACE(@@SERVERNAME, '\apssql', '') AS srvName + FROM sys.master_files AS [a] + CROSS APPLY ( + SELECT [x].[database_id], + [x].[file_id], + [x].[volume_mount_point], + [x].[volume_id], + [x].[logical_volume_name], + [x].[file_system_type], + [x].[total_bytes], + [x].[available_bytes], + [x].[supports_compression], + [x].[supports_alternate_streams], + [x].[supports_sparse_files], + [x].[is_read_only], + [x].[is_compressed], + ROW_NUMBER() OVER (PARTITION BY [x].[volume_mount_point] + ORDER BY [x].[volume_mount_point] DESC) AS rnk + FROM sys.dm_os_volume_stats(a.database_id, a.[file_id]) x ) b + WHERE [b].[rnk] = 1 + GROUP BY [b].[logical_volume_name], [b].[volume_mount_point] + ORDER BY [b].[volume_mount_point] ASC; \ No newline at end of file diff --git a/craft xml rdcman.sql b/craft xml rdcman.sql new file mode 100644 index 0000000..9dfb702 --- /dev/null +++ b/craft xml rdcman.sql @@ -0,0 +1,82 @@ +/* +generate xml fragment for RDCMANAGER groups +run this scrript on hcimon +*/ + +USE [ControlCenter] + + +DECLARE @tpl VARCHAR(max)=' + + @ou@ - @name@ + @dns@ + + +'; + + +SELECT + e.[EN_designation] + , s.[SE_designation] + , s.[SE_DNS] + --,s.* + , REPLACE(REPLACE(REPLACE(@tpl, '@name@',[s].[SE_designation] ), '@dns@',[s].[SE_DNS]),'@ou@', [s].[SE_OU_code] ) AS fragment +FROM [dbo].[Server] s + JOIN [dbo].[Entity] e ON e.[EN_id] = s.[SE_entity] +WHERE [e].[EN_designation] IN ( + --'Amavita' + --'Coop-Vitality' + 'Sun Store' +) +ORDER BY [e].[EN_designation], [s].[SE_designation] + + +DECLARE @tplGrpProp AS NVARCHAR(MAX)=' + + False + @grpName@ + +'; +DECLARE @tplSrv AS NVARCHAR(MAX)=' + + + @srvName@ + @dns@ + + @srvs@ + +'; +DECLARE @xmlTpl AS NVARCHAR(MAX)=' + + + + + + False + emtpy + + @grps@ + + + + + +' + +;WITH cteGrp AS ( + SELECT e.EN_designation, e.EN_id + FROM [dbo].[Entity] e +) +,cteSrv AS ( + SELECT + s.SE_designation AS srvName + , s.SE_DNS AS dns + , g.EN_designation AS grpName + , ROW_NUMBER()OVER(PARTITION BY g.EN_designation ORDER BY g.EN_designation, s.SE_designation) AS rid + FROM cteGrp g + JOIN dbo.Server s ON s.SE_entity = g.EN_id +) +SELECT * +FROM cteSrv s +ORDER BY s.grpName ASC, s.srvName ASC +; \ No newline at end of file diff --git a/craft xml replication monitor.sql b/craft xml replication monitor.sql index f08f9e6..acb692b 100644 --- a/craft xml replication monitor.sql +++ b/craft xml replication monitor.sql @@ -19,7 +19,7 @@ https://www.sqlservercentral.com/forums/topic/how-to-import-replication-monitor- and save it in the local folder - C:\Users\ua208700\AppData\Roaming\Microsoft\Microsoft SQL Server\200\Tools\SQL Monitor\rmsetting.xml + C:\Users\ua208700\AppData\Roaming\Microsoft\Microsoft SQL Server\160\Tools\SQL Monitor\rmsetting.xml */ USE [ControlCenter] diff --git a/delphix.create_delphix_d.sql b/delphix.create_delphix_d.sql new file mode 100644 index 0000000..cd08411 --- /dev/null +++ b/delphix.create_delphix_d.sql @@ -0,0 +1,222 @@ +USE HCITools +IF OBJECT_ID('delphix.create_delphix_db') IS NOT NULL + DROP PROCEDURE delphix.create_delphix_db; +GO +/* +This proc encapsulate the logic to create new backups of the databases to mask and restore them as {db_name}_delphix +Created from a script to be integrated into the process of refreshing the database prior to a test masking + +08.04.2024, TSC +*/ +CREATE PROCEDURE delphix.create_delphix_db + @action VARCHAR(50) = 'restore' + ,@db VARCHAR(255) = NULL + ,@debug BIT = 0 +AS +BEGIN + + SET XACT_ABORT ON; + SET NOCOUNT ON; + + DECLARE @dbName NVARCHAR(255); + DECLARE @query_bkp NVARCHAR(MAX)=''; + DECLARE @query_rest NVARCHAR(MAX)=''; + DECLARE @query_perms NVARCHAR(MAX)=''; + DECLARE @dump NVARCHAR(255); + DECLARE @users TABLE (login VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL); + INSERT INTO @users ([login],[name]) + VALUES + ('svc-delphix-masking','sql login'), + ('CENTRALINFRA\ua253440', 'Oliver'), + ('CENTRALINFRA\ua253450', 'Franck'), + ('CENTRALINFRA\ua210510', 'Wyn'); + + DECLARE @tplRight NVARCHAR(MAX) = N' +USE @dbName@_delphix +BEGIN TRY + CREATE USER [@login@] FOR LOGIN [@login@]; + ALTER ROLE [db_owner] ADD MEMBER [@login@] +END TRY +BEGIN CATCH + ALTER ROLE [db_owner] ADD MEMBER [@login@] +END CATCH + '; + DECLARE @error BIT = 0; + + IF NULLIF(@db,'') IS NULL + BEGIN + RAISERROR('No database specified.', 16, 99); + SET @error = 1; + END + + IF @db NOT IN ( 'arizona', 'arizonarep', 'hcitools', 'arizonacust', 'activepos_read', 'activepos_write' ) + BEGIN + RAISERROR('Database [%s] not part of the allowed values.', 16, 99, @db); + SET @error = 1; + END + + IF @action NOT IN ('all','restore','backup') + BEGIN + RAISERROR('Action [%s] not part of the allowed values (all, backup and restore).', 16, 99, @action); + SET @error = 1; + END + + IF @error = 0 + BEGIN + + DECLARE @DataDir nvarchar(4000), + @LogDir nvarchar(4000), + @BakDir nvarchar(4000), + @FTDir nvarchar(4000) + + Exec xp_instance_regread N'HKEY_LOCAL_MACHINE', + N'Software\Microsoft\MSSQLServer\MSSQLServer', + N'DefaultData', + @DataDir output, + 'no_output' + + Exec xp_instance_regread N'HKEY_LOCAL_MACHINE', + N'Software\Microsoft\MSSQLServer\MSSQLServer', + N'DefaultLog', + @LogDir output, + 'no_output' + + Exec xp_instance_regread N'HKEY_LOCAL_MACHINE', + N'Software\Microsoft\MSSQLServer\MSSQLServer', + N'BackupDirectory', + @BakDir output, + 'no_output' + + Exec xp_instance_regread N'HKEY_LOCAL_MACHINE', + N'Software\Microsoft\MSSQLServer\MSSQLServer', + N'FullTextDefaultPath', + @FTDir output, + 'no_output' + + DECLARE csrDb CURSOR FAST_FORWARD READ_ONLY FOR + SELECT [d].[name] + FROM sys.databases d + WHERE LOWER([d].[name]) = LOWER(@db); + + OPEN csrDb; + + FETCH NEXT FROM csrDb + INTO @dbName; + + WHILE @@FETCH_STATUS = 0 + BEGIN + SET @dump = @dbName+'_dump'; + IF NOT EXISTS ( + SELECT 1 + FROM sys.[backup_devices] + WHERE name = @dump + ) + BEGIN + RAISERROR ('No dump device named %s exists', 16, 1, @dump); + END + ELSE + IF @@SERVERNAME IN ('SWAMA707VM01\APSSQL','SWSUN004VM01\APSSQL') + BEGIN + SET @dump = replace('DISK = N''g:\@dbName@.bak''','@dbName@',@dbname); + END + ELSE + BEGIN + SET @dump = '['+@dbName+'_dump]'; + END + BEGIN + SET @query_bkp = @query_bkp + REPLACE(REPLACE(' +BACKUP DATABASE [@dbname@] TO @dump@ WITH COPY_ONLY, NOFORMAT, NOINIT, NAME = N''@dbname@-Full Database Backup'', COMPRESSION, SKIP, NOREWIND, NOUNLOAD, STATS = 10; + ' + ,'@dbname@' + ,@dbName) + + ,'@dump@' + ,@dump + ); + + DECLARE @file_row VARCHAR(255); + DECLARE @file_log VARCHAR(255); + + SELECT @file_row = name + FROM sys.master_files F + WHERE DB_NAME([F].[database_id]) = @dbName + AND type_desc = 'ROWS' + + SELECT @file_log = name + FROM sys.master_files F + WHERE DB_NAME([F].[database_id]) = @dbName + AND type_desc = 'LOG' + + IF @@SERVERNAME IN ('SWTSTDB01\APSSQL') + BEGIN + SET @dataDir = 'e:\SQLDatabase\'; + END + + SET @query_rest = @query_rest +REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(' +RESTORE DATABASE [@dbname@_delphix] FROM @dump@ WITH FILE = 1, REPLACE, MOVE N''@file_row@'' TO N''@dataDir@\@dbname@_delphix.mdf'', MOVE N''@file_Log@'' TO N''@logDir@\@dbname@_delphix_1.ldf'', NOUNLOAD, STATS = 5; +ALTER DATABASE [@dbname@_delphix] SET RECOVERY SIMPLE WITH ROLLBACK IMMEDIATE; +ALTER DATABASE [@dbname@_delphix] SET ALLOW_SNAPSHOT_ISOLATION ON; +ALTER DATABASE [@dbname@_delphix] SET READ_COMMITTED_SNAPSHOT ON; + ' + ,'@dbname@' + ,@dbName) + + ,'@dump@' + ,@dump) + + ,'@file_Log@' + ,@file_log) + + ,'@file_row@' + ,@file_row + ) + + ,'@dataDir@' + ,@dataDir + ) + + ,'@logDir@' + ,@logDir + ) + ; + + --permissions + SELECT @query_perms = @query_perms + REPLACE(REPLACE( + @tplRight + ,'@dbName@' + ,@dbName + ) + ,'@login@' + ,u.[login] + ) + FROM @users u + + FETCH NEXT FROM csrDb + INTO @dbName; + END + END + + CLOSE csrDb; + DEALLOCATE csrDb; + + IF @action IN('backup', 'all') + BEGIN + PRINT @query_bkp; + IF @debug = 0 + BEGIN + EXEC(@query_bkp); + END + END + + IF @action IN('restore', 'all') + BEGIN + PRINT @query_rest; + IF @debug = 0 + BEGIN + EXEC(@query_rest); + EXEC(@query_perms); + END + END + + END +END diff --git a/gaia - create linked server to hyperscale.sql b/gaia - create linked server to hyperscale.sql new file mode 100644 index 0000000..79711df --- /dev/null +++ b/gaia - create linked server to hyperscale.sql @@ -0,0 +1,43 @@ +USE [master] +GO + +/****** Object: LinkedServer [HYPERSCALE-AMA-PROD] Script Date: 29.12.2025 13:58:09 ******/ +EXEC master.dbo.sp_dropserver @server=N'HYPERSCALE-AMA-PROD', @droplogins='droplogins' +GO + + +USE [master] +GO +EXEC master.dbo.sp_addlinkedserver @server = N'HYPERSCALE-AMA-PROD', @srvproduct=N'HYPERSCALE-AMA-PROD', @provider=N'MSOLEDBSQL', @datasrc=N'sql-triapharmamaprod-sqlserver01.database.windows.net', @catalog=N'pharmacy' + +GO +EXEC master.dbo.sp_serveroption @server=N'HYPERSCALE-AMA-PROD', @optname=N'collation compatible', @optvalue=N'false' +GO +EXEC master.dbo.sp_serveroption @server=N'HYPERSCALE-AMA-PROD', @optname=N'data access', @optvalue=N'true' +GO +EXEC master.dbo.sp_serveroption @server=N'HYPERSCALE-AMA-PROD', @optname=N'dist', @optvalue=N'false' +GO +EXEC master.dbo.sp_serveroption @server=N'HYPERSCALE-AMA-PROD', @optname=N'pub', @optvalue=N'false' +GO +EXEC master.dbo.sp_serveroption @server=N'HYPERSCALE-AMA-PROD', @optname=N'rpc', @optvalue=N'false' +GO +EXEC master.dbo.sp_serveroption @server=N'HYPERSCALE-AMA-PROD', @optname=N'rpc out', @optvalue=N'false' +GO +EXEC master.dbo.sp_serveroption @server=N'HYPERSCALE-AMA-PROD', @optname=N'sub', @optvalue=N'false' +GO +EXEC master.dbo.sp_serveroption @server=N'HYPERSCALE-AMA-PROD', @optname=N'connect timeout', @optvalue=N'0' +GO +EXEC master.dbo.sp_serveroption @server=N'HYPERSCALE-AMA-PROD', @optname=N'collation name', @optvalue=null +GO +EXEC master.dbo.sp_serveroption @server=N'HYPERSCALE-AMA-PROD', @optname=N'lazy schema validation', @optvalue=N'false' +GO +EXEC master.dbo.sp_serveroption @server=N'HYPERSCALE-AMA-PROD', @optname=N'query timeout', @optvalue=N'0' +GO +EXEC master.dbo.sp_serveroption @server=N'HYPERSCALE-AMA-PROD', @optname=N'use remote collation', @optvalue=N'true' +GO +EXEC master.dbo.sp_serveroption @server=N'HYPERSCALE-AMA-PROD', @optname=N'remote proc transaction promotion', @optvalue=N'true' +GO +USE [master] +GO +EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'HYPERSCALE-AMA-PROD', @locallogin = NULL , @useself = N'False', @rmtuser = N'dba', @rmtpassword = N'pv2`~o8giLx~^6;fl,B7' +GO diff --git a/gaia - create structure for consolidated change tracking.sql b/gaia - create structure for consolidated change tracking.sql new file mode 100644 index 0000000..32d9a41 --- /dev/null +++ b/gaia - create structure for consolidated change tracking.sql @@ -0,0 +1,88 @@ +--create table to record state +IF NOT EXISTS ( + SELECT 1 + FROM [sys].[tables] AS [T] + WHERE [T].[name] = 'change_tracking_state' +) +BEGIN + --DROP TABLE [dbo].[change_tracking_state] + CREATE TABLE [dbo].[change_tracking_state] ( + [pharmacy_schema] sysname NOT NULL, + [table_name] sysname NOT NULL, + [last_sync_version] BIGINT NOT NULL, + CONSTRAINT PK_change_tracking_state PRIMARY KEY ( + [pharmacy_schema], + [table_name] + ) + ); +END; + +--enable change tracking if missing +IF NOT EXISTS ( + SELECT [d].[name], + [ctd].[database_id], + [ctd].[is_auto_cleanup_on], + [ctd].[retention_period], + [ctd].[retention_period_units], + [ctd].[retention_period_units_desc], + [ctd].[max_cleanup_version] + FROM [sys].[change_tracking_databases] AS [ctd] + JOIN [sys].[databases] AS [d] ON [d].[database_id] = [ctd].[database_id] + WHERE [d].[name] = 'pharmacy' +) +BEGIN + ALTER DATABASE [Pharmacy] + SET CHANGE_TRACKING = ON (CHANGE_RETENTION = 7 DAYS, AUTO_CLEANUP = ON); +END; + +--add tables to change tracking +DECLARE @tpl_ct NVARCHAR(MAX)='ALTER TABLE [@schema@].[@table@] ENABLE CHANGE_TRACKING WITH (TRACK_COLUMNS_UPDATED = ON); +' +DECLARE @q NVARCHAR(MAX)=''; + +SELECT @q = @q + REPLACE(REPLACE(@tpl_ct,'@schema@', s.name),'@table@', t.name) +FROM [sys].[tables] AS [t] + JOIN [sys].[schemas] AS [s] ON [s].[schema_id] = [t].[schema_id] +WHERE 1 = 1 + AND [s].[name] LIKE 'ama%' + AND [t].[name] IN ( N'Account', N'Account_key', N'Account_link', N'Account_text', N'Accounting_turnover_agg', + N'Address', N'Address_category', N'Address_category_text', N'Address_contact_person_list', + N'Address_Criteria', N'Address_key', N'Batch_run', N'BVR_member', N'CRS_batch_run', + N'CRS_document_header', N'DH_Criteria', N'Document_date', N'Document_error', N'Document_header', + N'Entry', N'Entry_reconciliation', N'Financial_relation_account' + ) + AND NOT EXISTS( + SELECT 1 + FROM sys.change_tracking_tables ct + WHERE OBJECT_SCHEMA_NAME(ct.object_id) = s.name + AND OBJECT_NAME(ct.object_id) = t.name + + ) +; + +EXEC(@q); + +--init change tracking +INSERT INTO [dbo].[change_tracking_state] ( + [pharmacy_schema], + [table_name], + [last_sync_version] +) +SELECT [s].[name] AS [pharmacy_schema], + [t].[name] AS [table_name], + CHANGE_TRACKING_CURRENT_VERSION() +FROM [sys].[tables] AS [t] + JOIN [sys].[schemas] AS [s] ON [s].[schema_id] = [t].[schema_id] +WHERE 1 = 1 + AND [s].[name] LIKE 'ama%' + AND [t].[name] IN ( N'Account', N'Account_key', N'Account_link', N'Account_text', N'Accounting_turnover_agg', + N'Address', N'Address_category', N'Address_category_text', N'Address_contact_person_list', + N'Address_Criteria', N'Address_key', N'Batch_run', N'BVR_member', N'CRS_batch_run', + N'CRS_document_header', N'DH_Criteria', N'Document_date', N'Document_error', N'Document_header', + N'Entry', N'Entry_reconciliation', N'Financial_relation_account' +) + AND NOT EXISTS ( + SELECT 1 + FROM [dbo].[change_tracking_state] AS [cts] + WHERE [cts].[pharmacy_schema] = [s].[name] AND [cts].[table_name] = [t].[name] + ); diff --git a/phidx masking central rollback.sql b/phidx masking central rollback.sql new file mode 100644 index 0000000..2cf16d1 --- /dev/null +++ b/phidx masking central rollback.sql @@ -0,0 +1,39 @@ +USE Arizona +GO + +BEGIN TRANSACTION +SET XACT_ABORT ON; +SET NOCOUNT ON; + +--revert address changes +UPDATE [ad] +SET [ad].[AD_first_name] = c.AD_first_name, + [ad].[AD_last_name] = C.AD_last_name, + [ad].[AD_middle_name] = c.AD_middle_name, + [ad].[AD_name] = c.AD_name, + [ad].[AD_title] = c.AD_title, + [ad].[AD_sex] = c.AD_sex, + [ad].[AD_address_1] = c.AD_address_1, + [ad].[AD_address_2] = c.AD_address_2, + [ad].[AD_address_3] = c.AD_address_3, + [ad].[AD_address_supplement] = c.AD_address_supplement, + [ad].[AD_zip_code] = c.AD_zip_code, + [ad].[AD_city] = c.AD_city, + [ad].[AD_state] = c.AD_state, + [ad].[AD_postal_routing_address] = c.AD_postal_routing_address, + [ad].[AD_language] = c.AD_language, + [ad].[AD_country] = c.AD_country +FROM dbo.Address ad + JOIN HCITools.tmp.tst_sp_correction c ON c.Address_ID = ad.Address_ID +WHERE ad.AD_name <> c.AD_name; + + +--revert address_key changes +UPDATE adk + SET adk.ADK_key = c.ADK_key +FROM dbo.Address_key adk + JOIN HCITools.tmp.tst_sp_correction c ON c.Address_ID = adk.ADK_address +WHERE adk.ADK_type=5; + +ROLLBACK TRANSACTION +--COMMIT TRANSACTION diff --git a/phidx masking package.sql b/phidx masking package.sql new file mode 100644 index 0000000..4f214f8 --- /dev/null +++ b/phidx masking package.sql @@ -0,0 +1,841 @@ +/* +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 :

'' +'' + + + + + + + + + '' + '' + + + + + + + ''+ '' +
ErrorNumberErrorSeverityErrorStateErrorProcedureErrorLineErrorMessage
'' + 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(), '''') + ''
+ + ''; + + set @mail_subject = ''INDEX - Transfert PharmIndex to PHGD_xx for items using checksum (Instance '' + @@SERVERNAME + '') - Job _D01941 - INDEX''; + +/* envoi du mail */ +exec Arizona.dbo.aps_Send_Mail_with_template + @in_param_varchar_2 = ''HCI_PharmIndex;HCI_DataManagement'', + @in_param_varchar_3 = @mail_message, + @in_param_subject = @mail_subject, + @in_job_type = 4; + +end catch + +', + @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'Update PEXF', + @step_id=5, + @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'declare @cvPHGDPriceCodePEXF int, + @SubsidiaryId int, + @w_date date + +select @SubsidiaryId = 1000, + @cvPHGDPriceCodePEXF = NULL, + @w_date = getdate() + +exec arizona.dbo.sp_bmc_Bmc_Applic_Default + @in_job_type = 3, + @in_param_int_1 = NULL, + @in_param_int_2 = @SubsidiaryId, + @in_param_varchar_1 = ''cvPHGDPriceCodePSL1'', + @out_default_value = @cvPHGDPriceCodePEXF output, + @out_param_int_1 = null + + +if @cvPHGDPriceCodePEXF is null + +begin + select @SubsidiaryId = 100 + + exec arizona.dbo.sp_bmc_Bmc_Applic_Default + @in_job_type = 3, + @in_param_int_1 = NULL, + @in_param_int_2 = @SubsidiaryId, + @in_param_varchar_1 = ''cvPHGDPriceCodePSL1'', + @out_default_value = @cvPHGDPriceCodePEXF output, + @out_param_int_1 = null +end + +/*------------- + Fermeture des PEXF sans Adresse pour les articles avec insurance code not in (10, 11) +------------------*/ + +Update top(5000) FP set fp.fp_end_date = DATEADD(d,-1,@w_date) +from subsidiary SUB with (nolock) + +join price_code PRC with (nolock) + on prc.prc_subsidiary = sub.subsidiary_id + and prc.price_code_id = @cvPHGDPriceCodePEXF + + join Fixed_price FP with (nolock) + on FP.FP_price_code = prc.price_code_id + and FP.fp_subsidiary = sub.subsidiary_id + and FP.FP_address is null + and FP.FP_start_date < GETDATE() + and ISNULL(fp.fp_end_date, ''2099-12-31'') > GETDATE() + + join Item_key ITK with (nolock) + on itk.ITK_item = fp.fp_item + and ITK.ITK_subsidiary = SUB.Subsidiary_ID + and ITK.ITK_type = 1 + + join PH_item phit with (nolock) + on phit.PHIT_item = ITK.ITK_item + and phit.PHIT_insurance_code not in (''10'', ''11'') + +where SUB.subsidiary_id = @SubsidiaryId + +/*--------------------------------------- +Clôture du PEXF sans adresse à la date -1 de la start_date du prix PEXF avec adresse +pour les articles LS. + +Nous recréons un PEXF avec la bonne start_date et le bon prix afin que la facturation aux caisse maladie soit OK +--------------*/ + +Update top(5000) FP1 set fp1.fp_end_date = DATEADD(d,-1,fp.FP_start_date) + + from subsidiary SUB with (nolock) + +join price_code PRC with (nolock) + on prc.prc_subsidiary = sub.subsidiary_id + and prc.price_code_id = @cvPHGDPriceCodePEXF + + join Fixed_price FP with (nolock) + on FP.FP_price_code = prc.price_code_id + and FP.fp_subsidiary = sub.subsidiary_id + and FP.FP_address is not null + and FP.FP_start_date < GETDATE() + and ISNULL(fp.fp_end_date, ''2099-12-31'') > GETDATE() + and FP.fixed_price_id = (select top 1 fp2.fixed_price_id from Fixed_price FP2 with (nolock) + where FP2.FP_item = FP.FP_item + and FP2.FP_price_code = fp.FP_price_code + and FP2.fp_subsidiary = FP.fp_subsidiary + and FP2.FP_address is not null + and FP2.FP_start_date < GETDATE() + and ISNULL(FP2.fp_end_date, ''2099-12-31'') > GETDATE() + + order by FP2.FP_start_date desc + ) + + join Item_key ITK with (nolock) + on itk.ITK_item = fp.fp_item + and ITK.ITK_subsidiary = SUB.Subsidiary_ID + and ITK.ITK_type = 1 + + join PH_item phit with (nolock) + on phit.PHIT_item = ITK.ITK_item + and phit.PHIT_insurance_code in (''10'', ''11'') + + join Fixed_price FP1 with (nolock) + on FP1.FP_price_code = prc.price_code_id + and FP1.fp_subsidiary = sub.subsidiary_id + and FP1.FP_address is null + and FP1.FP_start_date < GETDATE() + and ISNULL(FP1.fp_end_date, ''2099-12-31'') > GETDATE() + and FP1.FP_item = FP.FP_item + +where SUB.subsidiary_id = @SubsidiaryId + and isnull(FP.FP_tax_free_price_per_unit,0) <> isnull(FP1.FP_tax_free_price_per_unit,0) + +/*---------- + +Creation PEXF sans adresse avec start_date et prix du PEXF avec Adresse pour LS (Le plus récent) + +------------*/ + +declare + + @New_fixed_price_ID int, + @nb_fixed_price int , + @fp_subsidiary int, + @fp_tariff_type int, + @fp_item int, + @fp_currency int, + @fp_price_code int, + @fp_sales_tax_code int, + @FP_start_date datetime, + @FP_tax_free_price_per_unit dec(14,2) + + +SELECT @nb_fixed_price = 1 + +/*-- Declaration du curseur c_external_item --*/ +declare c_FP cursor local forward_only read_only static for + +select FP.fp_subsidiary, + FP.fp_tariff_type, + FP.fp_item, + FP.fp_currency, + FP.fp_price_code, + FP.fp_sales_tax_code, + FP.FP_start_date, + FP.FP_tax_free_price_per_unit + + from subsidiary SUB with (nolock) + +join price_code PRC with (nolock) + on prc.prc_subsidiary = sub.subsidiary_id + and prc.price_code_id = @cvPHGDPriceCodePEXF + + join Fixed_price FP with (nolock) + on FP.FP_price_code = prc.price_code_id + and FP.fp_subsidiary = sub.subsidiary_id + and FP.FP_address is not null + and FP.FP_start_date < GETDATE() + and ISNULL(fp.fp_end_date, ''2099-12-31'') > GETDATE() + and FP.fixed_price_id = (select top 1 fp2.fixed_price_id from Fixed_price FP2 with (nolock) + where FP2.FP_item = FP.FP_item + and FP2.FP_price_code = fp.FP_price_code + and FP2.fp_subsidiary = FP.fp_subsidiary + and FP2.FP_address is not null + and FP2.FP_start_date < GETDATE() + and ISNULL(FP2.fp_end_date, ''2099-12-31'') > GETDATE() + + order by FP2.FP_start_date desc + ) + + join Item_key ITK with (nolock) + on itk.ITK_item = fp.fp_item + and ITK.ITK_subsidiary = SUB.Subsidiary_ID + and ITK.ITK_type = 1 + + join PH_item phit with (nolock) + on phit.PHIT_item = ITK.ITK_item + and phit.PHIT_insurance_code in (''10'', ''11'') + + left outer join Fixed_price FP1 with (nolock) + on FP1.FP_price_code = prc.price_code_id + and FP1.fp_subsidiary = sub.subsidiary_id + and FP1.FP_address is null + and FP1.FP_start_date < GETDATE() + and ISNULL(FP1.fp_end_date, ''2099-12-31'') > GETDATE() + and FP1.FP_item = FP.FP_item + +where SUB.subsidiary_id = @SubsidiaryId + and FP1.Fixed_price_ID is null + + order by 1 + +open c_FP; + +fetch next from c_FP + into @fp_subsidiary , + @fp_tariff_type , + @fp_item , + @fp_currency , + @fp_price_code , + @fp_sales_tax_code , + @FP_start_date , + @FP_tax_free_price_per_unit + +while (@@fetch_status <> -1 ) +begin + + if (@@fetch_status <> -2 ) + begin + + /*----- Recherche dernier ID pour Fixed_Price -----*/ + select @New_fixed_price_ID = null + +exec sp_bmc_GetNextID + @in_key = ''fixed_price'', + @in_id_column = ''fixed_price_id'', + @in_nbr_of_record = @nb_fixed_price, + @out_id = @New_fixed_price_id output + +insert fixed_price +(fixed_price_id, + + fp_subsidiary, + fp_tariff_type, + fp_item, + fp_currency, + fp_price_code, + fp_sales_tax_code, + fp_start_date, + fp_tax_free_price_per_unit , + + fp_unit_code, + FP_price_per_unit_unit_code, + fp_final_discount_possible, + FP_discount_level_1_possible, + FP_discount_level_2_possible, + FP_origin, + FP_remark + + ) + select + @New_fixed_price_id, + + @fp_subsidiary , + @fp_tariff_type , + @fp_item , + @fp_currency , + @fp_price_code , + @fp_sales_tax_code , + @FP_start_date , + @FP_tax_free_price_per_unit, + 1, + 1, + 1, + 1, + 1, + 1, + ''Automatic Insert PEXF '' + + /*----- fin du curseur -----*/ + + + end /* (@@fetch_status <> -2 ) */ + +fetch next from c_FP + into @fp_subsidiary , + @fp_tariff_type , + @fp_item , + @fp_currency , + @fp_price_code , + @fp_sales_tax_code , + @FP_start_date , + @FP_tax_free_price_per_unit + +end /* (@@fetch_status <> -1 ) */ + +close c_FP; +deallocate c_FP; +', + @database_name=N'Arizona', + @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'Email step for success', + @step_id=6, + @cmdexec_success_code=0, + @on_success_action=1, + @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 Get_Job_Error_Info @in_JobName = ''_D03091 - INDEX - Load items CDS and prescribers from PharmIndex to Arizona - Central'', @in_Recipients = ''DBA_operator;HCI_PharmIndex'' + EXEC [mon].[Maj_Jobs_Status] @in_JobID = $(ESCAPE_SQUOTE(JOBID))', + @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'Send email KO', + @step_id=7, + @cmdexec_success_code=0, + @on_success_action=2, + @on_success_step_id=0, + @on_fail_action=2, + @on_fail_step_id=0, + @retry_attempts=0, + @retry_interval=0, + @os_run_priority=0, @subsystem=N'TSQL', + @command=N'exec Get_Job_Error_Info @in_JobName = ''_D03091 - INDEX - Load items CDS and prescribers from PharmIndex to Arizona - Central'', @in_Recipients = ''DBA_operator;HCI_PharmIndex;HCI_DataManagement'' + EXEC [mon].[Maj_Jobs_Status] @in_JobID = $(ESCAPE_SQUOTE(JOBID))', + @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 +EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1 +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback + +/* Attach existing specific schedule for job */ +declare @enabled_schedule int, + @schedule_name nvarchar(50) +declare c_schedules cursor local forward_only static for +select enabled, name + from msdb.dbo.sysschedules + where name LIKE '_D03091%' + and name LIKE '%#SPEC#' + +open c_schedules + +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +while @@fetch_status = 0 +begin + EXEC @ReturnCode = msdb.dbo.sp_attach_schedule @job_id = @jobId, @schedule_name=@schedule_name + IF(@enabled_schedule = 1) + begin + SET @schedule_name = SUBSTRING(@schedule_name,0,LEN(@schedule_name)-5) + IF EXISTS (select name from msdb.dbo.sysschedules where name = @schedule_name) + EXEC @ReturnCode = msdb.dbo.sp_update_schedule @name=@schedule_name, @enabled=0 + end + IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +FETCH NEXT FROM c_schedules into @enabled_schedule, @schedule_name +end + +close c_schedules + +deallocate c_schedules + +EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)' +IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback +COMMIT TRANSACTION +GOTO EndSave +QuitWithRollback: + IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION +EndSave: + +GO + diff --git a/query store search.sql b/query store search.sql new file mode 100644 index 0000000..d8d4afb --- /dev/null +++ b/query store search.sql @@ -0,0 +1,42 @@ +SELECT + qsq.query_id, + qsqt.query_sql_text, + qsp.plan_id, + qsrsi.start_time AS interval_start_time, + qsrsi.end_time AS interval_end_time, + qsr.execution_type_desc, + qsr.count_executions, + qsr.avg_duration / 1000.0 AS avg_duration_ms, + qsr.avg_cpu_time / 1000.0 AS avg_cpu_time_ms, + qsr.last_duration / 1000.0 AS last_duration_ms, + qsr.last_execution_time +FROM sys.query_store_query qsq +INNER JOIN sys.query_store_query_text qsqt + ON qsq.query_text_id = qsqt.query_text_id +INNER JOIN sys.query_store_plan qsp + ON qsq.query_id = qsp.query_id +INNER JOIN sys.query_store_runtime_stats qsr + ON qsp.plan_id = qsr.plan_id +INNER JOIN sys.query_store_runtime_stats_interval qsrsi + ON qsr.runtime_stats_interval_id = qsrsi.runtime_stats_interval_id +WHERE 1=1 +AND qsqt.query_sql_text LIKE '%@__ToString_0%' +AND [qsrsi].[start_time] BETWEEN '2025-10-08 10:55:00' AND '2025-10-08 11:05:00' +ORDER BY qsr.avg_duration / 1000.0 DESC; + +RETURN + +SELECT qsqt.query_sql_text,qsr.* +FROM sys.query_store_query qsq +INNER JOIN sys.query_store_query_text qsqt + ON qsq.query_text_id = qsqt.query_text_id +INNER JOIN sys.query_store_plan qsp + ON qsq.query_id = qsp.query_id +INNER JOIN sys.query_store_runtime_stats qsr + ON qsp.plan_id = qsr.plan_id +INNER JOIN sys.query_store_runtime_stats_interval qsrsi + ON qsr.runtime_stats_interval_id = qsrsi.runtime_stats_interval_id +WHERE 1=1 +AND [qsq].[query_id] = 18134177 +AND qsp.plan_id = 18157773 +AND [qsrsi].[start_time] BETWEEN '2025-10-08 10:55:00' AND '2025-10-08 11:05:00' \ No newline at end of file diff --git a/repl.sql b/repl.sql index 5d6a569..5b465b3 100644 --- a/repl.sql +++ b/repl.sql @@ -6,6 +6,8 @@ AND [pos].[POS_number] < 99 ORDER BY [pos].[POS_number] ; +SELECT ActivePos_write.upd.DatabaseVersion() AS currentVersion; + SELECT SettingValue AS backupSrc, SettingId FROM ActiveSystemServer.cfg.Settings WHERE SettingId LIKE 'Values.Modules.Replication.DbInitializationBackupPath%' @@ -65,22 +67,21 @@ END --check POS and PHCY versions SELECT ActivePos_write.upd.DatabaseVersion() AS currentVersion -EXEC ('SELECT ActivePos_write.upd.DatabaseVersion()') +EXEC ('SELECT ActivePos_write.upd.DatabaseVersion()') AT xxx + +--force restore after manual copy +EXEC ('exec ActivePos_write.dbo.InitializeActivePosReadFromBackup @BackUpFileWithPath = ''c:\temp\ActivePos_read.22.1.223.2401.bak''') AT xxx + +--to start on the pos to force a restore of the backup. adapt version, mac and UNC before running +exec ActiveSystemClient.dbo.DBAReplPosSubscription + @mac = '9C-7B-EF-43-5A-98', + @serverDbVersion = '23.2.23.19501', + @preferedReplinibackup= '\\cvi247aps-replinibackup.coop-vitality.ch\replinibackup\ActivePos_read.23.2.23.19501.bak' --restart service on pos -EXEC ('EXEC xp_cmdshell ''net stop ActiveposClientService'';EXEC xp_cmdshell ''net start ActiveposClientService''') -exec xp_cmdshell 'net stop ActiveposClientService' -exec xp_cmdshell 'net start ActiveposClientService' - - +EXEC ('EXEC xp_cmdshell ''net stop ActiveposClientService'';EXEC xp_cmdshell ''net start ActiveposClientService''') AT xxx --subscription EXEC ActivePos_read..sp_dropsubscription @publication = N'ActivePosTran', @article = N'all', @subscriber ='xxx' - -select * ---delete s -from distribution.dbo.MSsubscriber_schedule s -where subscriber='xxxx' - EXEC ActiveSystemServer.dbo.RepairReplication diff --git a/sqlLogin-db-pipeline creation and setup.sql b/sqlLogin-db-pipeline creation and setup.sql new file mode 100644 index 0000000..4a9e5fa --- /dev/null +++ b/sqlLogin-db-pipeline creation and setup.sql @@ -0,0 +1,79 @@ +/* +This script setups the needed permissions to enable Triapharm devops pipeline access to +Triapharm databases + +The permissions assigned are: + Server level: + * ALTER ANY DATABASE + * ##MS_DatabaseManager## + * ##MS_ServerPerformanceStateReader## + * ##MS_ServerStateReader## +*/ + +USE master +GO + +-- Check if the login exists, if not, create it +IF NOT EXISTS (SELECT * FROM sys.server_principals WHERE name = N'sqlLogin-db-pipeline') +BEGIN + CREATE LOGIN [sqlLogin-db-pipeline] WITH PASSWORD = N'tzJcO,O8S~k~u^zR6!JL'; +END +ELSE +BEGIN + ALTER LOGIN [sqlLogin-db-pipeline] WITH PASSWORD = N'tzJcO,O8S~k~u^zR6!JL'; +END +GO + +-- Grant access to DMVs +GRANT VIEW SERVER STATE TO [sqlLogin-db-pipeline]; + +GO + +DECLARE @q NVARCHAR(MAX) = ' +USE ? +IF EXISTS( + SELECT * + FROM sys.databases d + WHERE d.name = DB_NAME() + AND ( + [d].[source_database_id] IS NULL + AND [d].[is_read_only] = 0 + AND [d].[is_in_standby] = 0 + AND [d].[state] = 0 --online + ) +) + +BEGIN + IF DB_NAME() NOT IN (''master'',''tempdb'',''model'') + BEGIN + IF NOT EXISTS (SELECT * FROM ?.sys.database_principals WHERE name = N''sqlLogin-db-pipeline'') + BEGIN + CREATE USER [sqlLogin-db-pipeline] FOR LOGIN [sqlLogin-db-pipeline]; + END + END + + IF DB_NAME() = ''msdb'' + BEGIN + --allow jobs creation / modification / deletion + ALTER ROLE [SQLAgentOperatorRole] ADD MEMBER [sqlLogin-db-pipeline]; + + END + + IF DB_NAME() NOT IN (''master'',''msdb'',''tempdb'',''model'') + BEGIN + --give permission to alter / create / drop objects in db + ALTER ROLE [db_ddladmin] ADD MEMBER [sqlLogin-db-pipeline]; + + -- Grant permissions for change tracking and broker management + GRANT ALTER ON DATABASE::[?] TO [sqlLogin-db-pipeline]; + + + END +END +' +EXEC sys.sp_MSforeachdb @command1 = @q + + + + + diff --git a/todo clean masking.sql b/todo clean masking.sql new file mode 100644 index 0000000..44d0e6f --- /dev/null +++ b/todo clean masking.sql @@ -0,0 +1,402 @@ +USE Arizona + + +/* +1. identify if the duplicate addresses are linked to a persisted or masked address +2. TODO: udpate document_counter with max value of adk_key for type 7 and 8 + SELECT dc.* + FROM dbo.Document_counter dc + JOIN ActivePos_read.dbo.CommonVar cv ON cv.[Key] = 'cvCounterADKType7' AND cv.Value = dc.Document_counter_ID +3. delete address_key rows for masked addresses + +*/ +BEGIN TRANSACTION +SET XACT_ABORT ON; +SET NOCOUNT ON; + +IF OBJECT_ID('tempdb..#mask')IS NOT NULL BEGIN; + DROP TABLE #mask; +END; + +CREATE TABLE #mask(address_id INT NOT NULL, TT_masking VARCHAR(20) NOT NULL DEFAULT 'MASK') + +--fetch duplicate in temp table +INSERT INTO #mask +( + address_id +) +SELECT k.ADK_address +FROM dbo.Address_key k +WHERE k.ADK_type = 7 +AND EXISTS( + --get all duplicated adk_key for type 7 + SELECT s.ADK_key + FROM dbo.Address_key s + WHERE s.ADK_type=7 + AND k.ADK_key = s.ADK_key + GROUP BY s.ADK_subsidiary, s.ADK_key + HAVING COUNT(1)>1 +) + +--#region flag masked or not address +DECLARE @keywords TABLE(pattern VARCHAR(255) NOT NULL); + +INSERT INTO @keywords ([pattern]) +SELECT 'TEST %' +UNION SELECT 'Assura%' +UNION SELECT 'PRESCRIPTION%' +UNION SELECT 'RETETE%' +UNION SELECT 'USER%' +UNION SELECT 'ONBOARD%' +UNION SELECT 'SUSPICIOUS%' +UNION SELECT 'DOE' +UNION SELECT 'GIALLO%' +UNION SELECT 'TOLKIEN%' +UNION SELECT 'DEMO %' +UNION SELECT 'demo' +UNION SELECT 'DOCUMEDIS%' +UNION SELECT 'OMNICHANNEL%' +UNION SELECT 'LASTNAME%' +UNION SELECT 'MeiXin%' +UNION SELECT 'DIPLOMATE%' +UNION SELECT 'NO %' +UNION SELECT 'ONLY%' +UNION SELECT 'RDL%' +UNION SELECT 'USER%' +UNION SELECT 'GALEXIS%' +UNION SELECT 'APOS%' +UNION SELECT 'APOSANDMAGENTO%' +UNION SELECT 'Activate' +UNION SELECT 'Sunstore' +UNION SELECT 'Coopvitality' +UNION SELECT 'Ama Plus Sun' +UNION SELECT 'Ama Plus Cvi' +UNION SELECT 'Sun Plus Cvi' +UNION SELECT 'Ama Sun Cvi' +UNION SELECT 'test%[0-9]%' +UNION SELECT 'DEMO' +UNION SELECT '%SUNCLUB%' +UNION SELECT '%QUALITY%' +UNION SELECT '%STARCARD%' +UNION SELECT '%CLIENT%' +UNION SELECT '%MAGENTO%' +UNION SELECT '%RENOUVELLEMENT%' +UNION SELECT '%Mitarbeiter%' +UNION SELECT '% DEV %' +UNION SELECT 'CERN Service%' +UNION SELECT 'BALEXERT CENTRE%' +UNION SELECT 'G.H.O.L.%' +UNION SELECT 'ONLYAPOS%' +UNION SELECT 'In APOS%' +UNION SELECT '%client de passage%' +; + +DECLARE @tpl VARCHAR(MAX)=' +UPDATE m SET [TT_masking] = ''PERSIST'' +FROM dbo.Address ad + JOIN #mask m on m.address_id = ad.address_id + JOIN dbo.Customer cst + ON [cst].[CUST_address] = [ad].[Address_ID] + LEFT JOIN dbo.[Subsidiary] sub + ON [cst].[CUST_subsidiary] = [sub].[Subsidiary_ID] +WHERE [m].[TT_masking] <> ''PERSIST'' +AND ( + ( + [ad].[Address_ID] < 1500000000 + AND NOT EXISTS (SELECT 3 FROM [dbo].[Employee] WHERE EM_address = ad.Address_ID) + AND NOT EXISTS (SELECT 3 FROM [dbo].[Customer] WHERE CUST_address = ad.Address_ID) + ) + OR( + @all_keywords@ + ) +) +'; +DECLARE @tplFragment VARCHAR(MAX)=' + OR ( + ad.[AD_last_name] @op@ ''@keyword@'' + OR ad.[AD_name] @op@ ''@keyword@'' + ) +'; +DECLARE @all_keywords VARCHAR(MAX)=''; +SELECT @all_keywords = @all_keywords + REPLACE(REPLACE(@tplFragment, '@keyword@', k.[pattern]), '@op@', CASE WHEN CHARINDEX('%',k.[pattern])>0 THEN 'LIKE' ELSE '=' END) +FROM @keywords k; +SELECT @all_keywords = STUFF(@all_keywords, 1,CHARINDEX('OR',@all_keywords)+2,''); + +DECLARE @query VARCHAR(MAX)=''; +SELECT @query = REPLACE(@tpl, '@all_keywords@', @all_keywords); + +--PRINT @query; +EXEC(@query); + + +UPDATE m + SET m.[TT_masking] = 'PERSIST' + FROM dbo.PH_prescriber ph + INNER JOIN dbo.Address ad + ON [ad].[Address_ID] = [ph].[PHPR_address] + JOIN #mask m ON m.address_id = ad.Address_ID + WHERE [ph].[PHPR_deactivation_date] IS NULL + AND m.[TT_masking] <> 'PERSIST'; + +UPDATE m + SET m.[TT_masking] = 'MASK' + FROM Address ad + JOIN #mask m ON m.address_id = ad.Address_ID + WHERE TT_masking <> 'MASK' + AND ( ad.AD_last_name LIKE 'TESTORI%' + OR ad.AD_last_name LIKE 'APOSTOLOV%' + OR ad.AD_last_name LIKE 'TESTOLIN%' + OR ad.AD_last_name LIKE 'DEMONT%' + OR ad.AD_first_name like 'Testalem%'); + + +UPDATE m + SET m.[TT_masking] = 'PERSIST' + FROM Address ad + JOIN #mask m ON m.address_id = ad.Address_ID + INNER JOIN dbo.Bmc_user_profile bup + ON bup.BMCUP_address = ad.Address_ID + WHERE bup.BMCUP_Initials NOT IN ( 'AMAVITA', 'MEDI', 'PHAR', 'Tran', 'TRIA', 'TRIC', 'TRIM', 'TRIS', 'TRPH' ) + AND bup.BMCUP_Initials NOT LIKE 'GAL-%' /* Galenica users */ + AND bup.BMCUP_Initials NOT LIKE 'HCI-%' /* HCI Solutions users */ + AND bup.BMCUP_Initials NOT LIKE 'EXT-%' /* External Users - 20626*/ + AND bup.BMCUP_Initials NOT LIKE 'GC-%' /* GaleniCare Users - 20619*/ + AND bup.Bmc_user_profile_Id NOT IN ( 1, 234 ); + +--persist addresses in satellite tables that we need to keep +UPDATE m + SET m.[TT_masking] = 'PERSIST' + FROM Address ad + JOIN #mask m ON m.address_id = ad.Address_ID + JOIN ph_insurance_card c + ON c. PHIC_patient_address = ad.Address_ID + WHERE c.phic_code IN ( + '80756012350000207901' + ,'80756012350000206169' + ,'80756012350000206899' + ,'80756012350000205871' + ,'80756012350000210793' +); + +UPDATE m + SET m.[TT_masking] = 'PERSIST' + FROM Address ad + JOIN #mask m ON m.address_id = ad.Address_ID + JOIN Organizational_unit ou + ON ou.OU_address = ad.Address_ID + WHERE m.[TT_masking] = 'MASK'; + +UPDATE m + SET m.[TT_masking] = 'PERSIST' + FROM Address ad + JOIN #mask m ON m.address_id = ad.Address_ID + JOIN Organizational_unit ou + ON ou.OU_manager_address = ad.Address_ID + WHERE m.[TT_masking] = 'MASK'; + +UPDATE m + SET m.[TT_masking] = 'PERSIST' + FROM Address ad + JOIN #mask m ON m.address_id = ad.Address_ID + JOIN dbo.PH_insurance phi + ON phi.PHIN_address = ad.Address_ID + WHERE m.[TT_masking] = 'MASK'; + +UPDATE m + SET m.[TT_masking] = 'PERSIST' + FROM Address ad + JOIN #mask m ON m.address_id = ad.Address_ID + JOIN PH_Organizational_unit phou + ON phou.PHOU_manager_address = ad.Address_ID + WHERE m.[TT_masking] = 'MASK'; + +UPDATE m + SET m.[TT_masking] = 'PERSIST' + FROM Address ad + JOIN #mask m ON m.address_id = ad.Address_ID + JOIN PH_Organizational_unit phou + ON phou.PHOU_distribution_center = ad.Address_ID + WHERE m.[TT_masking] = 'MASK'; + +UPDATE m + SET m.[TT_masking] = 'PERSIST' + FROM Address ad + JOIN #mask m ON m.address_id = ad.Address_ID + JOIN PH_prescriber php + ON php.PHPR_address = ad.Address_ID + WHERE m.[TT_masking] = 'MASK'; + +UPDATE m + SET m.[TT_masking] = 'PERSIST' + FROM Address ad + JOIN #mask m ON m.address_id = ad.Address_ID + JOIN Incident_header ih + ON ih.INH_contact_address = ad.Address_ID + WHERE m.[TT_masking] = 'MASK'; + +UPDATE m + SET m.[TT_masking] = 'PERSIST' + FROM Address ad + JOIN #mask m ON m.address_id = ad.Address_ID + JOIN Incident_header ih + ON ih.INH_originator_address = ad.Address_ID + WHERE m.[TT_masking] = 'MASK'; + +UPDATE m + SET m.[TT_masking] = 'PERSIST' + FROM Address ad + JOIN #mask m ON m.address_id = ad.Address_ID + JOIN Serial_number_history snh + ON snh.SNH_address = ad.Address_ID + WHERE m.[TT_masking] = 'MASK'; + +UPDATE m + SET m.[TT_masking] = 'PERSIST' + FROM Address ad + JOIN #mask m ON m.address_id = ad.Address_ID + JOIN dbo.Item_relation_info iri + ON iri.ITRI_address = ad.Address_ID + WHERE m.[TT_masking] = 'MASK'; + +UPDATE m + SET m.[TT_masking] = 'PERSIST' + FROM Address ad + JOIN #mask m ON m.address_id = ad.Address_ID + JOIN dbo.Fixed_price fp + ON fp.FP_address = ad.Address_ID + WHERE m.[TT_masking] = 'MASK'; + +UPDATE m + SET m.[TT_masking] = 'PERSIST' + FROM Address ad + JOIN #mask m ON m.address_id = ad.Address_ID + JOIN dbo.Fixed_price fp + ON fp.FP_address = ad.Address_ID + WHERE m.[TT_masking] = 'MASK'; + +UPDATE m + SET m.[TT_masking] = 'PERSIST' + FROM Address ad + JOIN #mask m ON m.address_id = ad.Address_ID + JOIN dbo.Tariff t + ON t.TF_address = ad.Address_ID + WHERE m.[TT_masking] = 'MASK'; + +UPDATE m + SET m.[TT_masking] = 'PERSIST' + FROM Address ad + JOIN #mask m ON m.address_id = ad.Address_ID + JOIN dbo.Asset a + ON a.AS_owner = ad.Address_ID + WHERE m.[TT_masking] = 'MASK'; + +UPDATE m + SET m.[TT_masking] = 'PERSIST' + FROM Address ad + JOIN #mask m ON m.address_id = ad.Address_ID + JOIN dbo.Asset a + ON a.AS_supplier = ad.Address_ID + WHERE m.[TT_masking] = 'MASK'; + +UPDATE m + SET m.[TT_masking] = 'PERSIST' + FROM Address ad + JOIN #mask m ON m.address_id = ad.Address_ID + JOIN dbo.Asset a + ON a.AS_manufacturer = ad.Address_ID + WHERE m.[TT_masking] = 'MASK'; + +UPDATE m + SET m.[TT_masking] = 'PERSIST' + FROM Address ad + JOIN #mask m ON m.address_id = ad.Address_ID + JOIN dbo.Supplier s + ON s.SUPP_pay_to = ad.Address_ID + WHERE m.[TT_masking] = 'MASK'; + +UPDATE m + SET m.[TT_masking] = 'PERSIST' + FROM Address ad + JOIN #mask m ON m.address_id = ad.Address_ID + JOIN dbo.Supplier s + ON s.SUPP_send_order_to = ad.Address_ID + WHERE m.[TT_masking] = 'MASK'; + +UPDATE m + SET m.[TT_masking] = 'PERSIST' + FROM Address ad + JOIN #mask m ON m.address_id = ad.Address_ID + JOIN dbo.Supplier s + ON s.SUPP_send_order_to = ad.Address_ID + WHERE m.[TT_masking] = 'MASK'; + +UPDATE m + SET m.[TT_masking] = 'PERSIST' + FROM Address ad + JOIN #mask m ON m.address_id = ad.Address_ID + WHERE m.[TT_masking] = 'MASK' + AND ad.AD_origin = 1; + +--#endregion flag masked or not address + +--count how much rows should be masked or persisted. distribution should be 50% for each exactly +SELECT m.TT_masking, COUNT(1) AS cnt +FROM #mask m +GROUP BY m.TT_masking; + +--check if duplicates are still present in the rows marked as PERSIST. there should be none +IF EXISTS( + SELECT 1 + FROM #mask m + JOIN dbo.Address_key ak ON ak.ADK_address = m.address_id + WHERE ak.ADK_type = 7 + AND m.TT_masking = 'PERSIST' + GROUP BY ak.ADK_subsidiary, ak.ADK_key + HAVING COUNT(1) > 1 +) +BEGIN + RAISERROR('There are still %i rows that are duplicated on addresses marked as PERSIST, check further', 18,6, @@ROWCOUNT); +END + +--update address_key +DELETE ak +FROM dbo.Address_key ak + JOIN #mask m ON m.address_id = ak.ADK_address +WHERE ak.ADK_type=7 +AND m.TT_masking = 'MASK'; +PRINT CONVERT(VARCHAR(20), CURRENT_TIMESTAMP, 114)+' - Deleted adk_type 7 records causing duplication. '+REPLACE(REPLACE(CONVERT(VARCHAR(100), CONVERT(MONEY, @@rowcount), 1),',',''''),'.00','')+' row(s) affected.'; + + +--check again for duplicate +SELECT k.ADK_address +FROM dbo.Address_key k +WHERE k.ADK_type = 7 +AND EXISTS( + SELECT s.ADK_key + FROM dbo.Address_key s + WHERE s.ADK_type=7 + AND k.ADK_key = s.ADK_key + GROUP BY s.ADK_subsidiary, s.ADK_key + HAVING COUNT(1)>1 +); + +--fetch max value of the counter +DECLARE @maxVal INT; +SELECT @maxVal = MAX(CONVERT(INT, ADK_key)) +FROM dbo.Address_key +WHERE ADK_type = 7 + +--update counter value +DECLARE @outCounter TABLE(id INT, oldVal INT, newVal INT) +UPDATE dc + SET dc.DOCC_value = @maxVal +OUTPUT Inserted.Document_counter_ID, inserted.DOCC_value, Deleted.DOCC_value INTO @outCounter(id, newVal, oldVal) +FROM dbo.Document_counter dc + JOIN ActivePos_read.dbo.CommonVar cv ON cv.[Key] = 'cvCounterADKType7' AND cv.Value = dc.Document_counter_ID +; + +--show previous and new value of the counter +SELECT * +FROM @outCounter; + +ROLLBACK TRANSACTION \ No newline at end of file