This commit is contained in:
Schork Thierry (Galenica)
2026-01-13 08:14:13 +01:00
parent 820c487c35
commit 5a4f2784bb
23 changed files with 3503 additions and 128 deletions

View File

@@ -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]

View File

@@ -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.';

View File

@@ -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);

View File

@@ -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

View File

@@ -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

View File

@@ -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]

View File

@@ -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

View File

@@ -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

View File

@@ -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;
PRINT @PermissionScripts;

View File

@@ -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;

View File

@@ -23,6 +23,5 @@ AND NOT EXISTS(
IF NULLIF(@q,'') IS NOT NULL
BEGIN
PRINT @q
select @q
EXEC(@q)
END

View File

@@ -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;

82
craft xml rdcman.sql Normal file
View File

@@ -0,0 +1,82 @@
/*
generate xml fragment for RDCMANAGER groups
run this scrript on hcimon
*/
USE [ControlCenter]
DECLARE @tpl VARCHAR(max)=' <server>
<properties>
<displayName>@ou@ - @name@</displayName>
<name>@dns@</name>
</properties>
</server>
';
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)='
<properties>
<expanded>False</expanded>
<name>@grpName@</name>
</properties>
';
DECLARE @tplSrv AS NVARCHAR(MAX)='
<server>
<properties>
<displayName>@srvName@</displayName>
<name>@dns@</name>
</properties>
@srvs@
</server>
';
DECLARE @xmlTpl AS NVARCHAR(MAX)='
<?xml version="1.0" encoding="utf-8"?>
<RDCMan programVersion="2.93" schemaVersion="3">
<file>
<credentialsProfiles />
<properties>
<expanded>False</expanded>
<name>emtpy</name>
</properties>
@grps@
</file>
<connected />
<favorites />
<recentlyUsed />
</RDCMan>
'
;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
;

View File

@@ -19,7 +19,7 @@ https://www.sqlservercentral.com/forums/topic/how-to-import-replication-monitor-
</PublisherGroups>
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]

View File

@@ -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

View File

@@ -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

View File

@@ -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]
);

View File

@@ -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

841
phidx masking package.sql Normal file
View File

@@ -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 = '' <html><body><p>Résumé des erreurs dans le tableau ci-dessous : </p>'' +''
<table border="1" width="400px" height="400px">
<tr>
<th>ErrorNumber</th>
<th>ErrorSeverity</th>
<th>ErrorState</th>
<th>ErrorProcedure</th>
<th>ErrorLine</th>
<th>ErrorMessage</th>
</tr>'' + ''<tr valign="center">
<td>'' + isnull(convert(varchar, ERROR_NUMBER()), '''') + ''</td>
<td>'' + isnull(convert(varchar, ERROR_SEVERITY()), '''') + ''</td>
<td>'' + isnull(convert(varchar, ERROR_STATE()), '''') + ''</td>
<td>'' + isnull(ERROR_PROCEDURE(), '''') + ''</td>
<td>'' + isnull(convert(varchar, ERROR_LINE()), '''') + ''</td>
<td>'' + isnull(ERROR_MESSAGE(), '''') + ''</td>
</tr>''+ ''
</table>
</body>
</html>'';
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

42
query store search.sql Normal file
View File

@@ -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'

View File

@@ -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

View File

@@ -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

402
todo clean masking.sql Normal file
View File

@@ -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