Skip to content

Commit 029984e

Browse files
committed
Template refinements.
1 parent fc57d29 commit 029984e

File tree

5 files changed

+195
-56
lines changed

5 files changed

+195
-56
lines changed

Virtual_EDW/Templates/templateCollection.json

Lines changed: 61 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
"TemplateOutputFileConvention": "{targetDataObject.name}.sql",
3939
"TemplateFilePath": "templateLinkSatelliteView.handlebars",
4040
"TemplateNotes": ""
41-
},
41+
},
4242
{
4343
"TemplateName": "100 Data Vault Satellite View Template",
4444
"TemplateType": "Context",
@@ -48,12 +48,20 @@
4848
"TemplateNotes": ""
4949
},
5050
{
51-
"TemplateName": "100 Dimension / PIT Select Template",
52-
"TemplateType": "Presentation",
53-
"TemplateConnectionKey": "IntegrationConnectionInternalId",
51+
"TemplateName": "100 Landing",
52+
"TemplateType": "StagingArea",
53+
"TemplateConnectionKey": "StagingConnectionInternalId",
5454
"TemplateOutputFileConvention": "{targetDataObject.name}.sql",
55-
"TemplateFilePath": "templateDimSelect.handlebars",
56-
"TemplateNotes": "Taken from earlier VDW versions, demonstrating one possible DIM / PIT template."
55+
"TemplateFilePath": "templateLanding.handlebars",
56+
"TemplateNotes": ""
57+
},
58+
{
59+
"TemplateName": "100 Landing With Direct Wrapper",
60+
"TemplateType": "StagingArea",
61+
"TemplateConnectionKey": "StagingConnectionInternalId",
62+
"TemplateOutputFileConvention": "{targetDataObject.name}.sql",
63+
"TemplateFilePath": "templateLandingWithDirect.handlebars",
64+
"TemplateNotes": "This template performs a full copy of a source data object into the landing area, using a DIRECT wrapper"
5765
},
5866
{
5967
"TemplateName": "100 Persistent Staging Area View Template",
@@ -271,6 +279,22 @@
271279
"TemplateFilePath": "templateLinkGenerateTables.handlebars",
272280
"TemplateNotes": "Creating tables for Natural Business Relationships."
273281
},
282+
{
283+
"TemplateName": "500 Data Vault Link-Satellite Reinitialisation Template",
284+
"TemplateType": "NaturalBusinessRelationshipContext",
285+
"TemplateConnectionKey": "PsaConnectionInternalId",
286+
"TemplateOutputFileConvention": "{targetDataObject.name}_reinitialise.sql",
287+
"TemplateFilePath": "loadPatternLinkSatelliteReinitialisation.handlebars",
288+
"TemplateNotes": ""
289+
},
290+
{
291+
"TemplateName": "500 Data Vault Satellite Batch/Module Registration for DIRECT",
292+
"TemplateType": "Context",
293+
"TemplateConnectionKey": "IntegrationConnectionInternalId",
294+
"TemplateOutputFileConvention": "{targetDataObject.name}_DIRECT.sql",
295+
"TemplateFilePath": "templateSatelliteDirectRegistration.handlebars",
296+
"TemplateNotes": "Creating DIRECT registration scripts."
297+
},
274298
{
275299
"TemplateName": "500 Data Vault Satellite Generate Tables",
276300
"TemplateType": "Context",
@@ -280,12 +304,12 @@
280304
"TemplateNotes": "Creating tables for Context tables."
281305
},
282306
{
283-
"TemplateName": "500 Data Vault Satellite Batch/Module Registration for DIRECT",
307+
"TemplateName": "500 Data Vault Satellite Reinitialisation Template",
284308
"TemplateType": "Context",
285-
"TemplateConnectionKey": "IntegrationConnectionInternalId",
286-
"TemplateOutputFileConvention": "{targetDataObject.name}_DIRECT.sql",
287-
"TemplateFilePath": "templateSatelliteDirectRegistration.handlebars",
288-
"TemplateNotes": "Creating DIRECT registration scripts."
309+
"TemplateConnectionKey": "PsaConnectionInternalId",
310+
"TemplateOutputFileConvention": "{targetDataObject.name}_reinitialise.sql",
311+
"TemplateFilePath": "loadPatternSatelliteReinitialisation.handlebars",
312+
"TemplateNotes": ""
289313
},
290314
{
291315
"TemplateName": "500 Link Batch/Module Registration for DIRECT",
@@ -358,23 +382,7 @@
358382
"TemplateOutputFileConvention": "{targetDataObject.name}_SelectView.sql",
359383
"TemplateFilePath": "templateLandingtoSilverFromView.handlebars",
360384
"TemplateNotes": "Azure Databricks insert into Staging Area. This template generates the select column list command from the view which is created from dataframe."
361-
},
362-
{
363-
"TemplateName": "500 Data Vault Satellite Reinitialisation Template",
364-
"TemplateType": "Context",
365-
"TemplateConnectionKey": "PsaConnectionInternalId",
366-
"TemplateOutputFileConvention": "{targetDataObject.name}_reinitialise.sql",
367-
"TemplateFilePath": "loadPatternSatelliteReinitialisation.handlebars",
368-
"TemplateNotes": ""
369-
},
370-
{
371-
"TemplateName": "500 Data Vault Link-Satellite Reinitialisation Template",
372-
"TemplateType": "NaturalBusinessRelationshipContext",
373-
"TemplateConnectionKey": "PsaConnectionInternalId",
374-
"TemplateOutputFileConvention": "{targetDataObject.name}_reinitialise.sql",
375-
"TemplateFilePath": "loadPatternLinkSatelliteReinitialisation.handlebars",
376-
"TemplateNotes": ""
377-
},
385+
},
378386
{
379387
"TemplateName": "900 Unit Test - Hub Key Null Check",
380388
"TemplateType": "CoreBusinessConcept",
@@ -391,6 +399,14 @@
391399
"TemplateFilePath": "template_test_HUB_KeyTrimCheck.handlebars",
392400
"TemplateNotes": "Unit test for checking leading or trailing spaces on the Hub business key."
393401
},
402+
{
403+
"TemplateName": "900 Unit Test - Landing Reconciliation",
404+
"TemplateType": "StagingArea",
405+
"TemplateConnectionKey": "StagingConnectionInternalId",
406+
"TemplateOutputFileConvention": "{targetDataObject.name}_TEST_RECON.sql",
407+
"TemplateFilePath": "templateLandingTestReconciliation.handlebars",
408+
"TemplateNotes": ""
409+
},
394410
{
395411
"TemplateName": "900 Unit Test - STG to SAT Check",
396412
"TemplateType": "Context",
@@ -400,29 +416,29 @@
400416
"TemplateNotes": "Data Vault Sat Pattern to create unit test for checking mapping and data completeness between STG and SAT"
401417
},
402418
{
403-
"TemplateName": "100 Landing With Direct Wrapper",
404-
"TemplateType": "StagingArea",
405-
"TemplateConnectionKey": "StagingConnectionInternalId",
419+
"TemplateName": "Daily snapshot",
420+
"TemplateType": "Presentation",
421+
"TemplateConnectionKey": "IntegrationConnectionInternalId",
406422
"TemplateOutputFileConvention": "{targetDataObject.name}.sql",
407-
"TemplateFilePath": "templateLandingWithDirect.handlebars",
408-
"TemplateNotes": "This template performs a full copy of a source data object into the landing area, using a DIRECT wrapper"
423+
"TemplateFilePath": "templatePresentationDailySnapshot.handlebars",
424+
"TemplateNotes": ""
409425
},
410426
{
411-
"TemplateName": "100 Landing",
412-
"TemplateType": "StagingArea",
413-
"TemplateConnectionKey": "StagingConnectionInternalId",
427+
"TemplateName": "Dimension / PIT Select Template",
428+
"TemplateType": "Presentation",
429+
"TemplateConnectionKey": "PsaConnectionInternalId",
414430
"TemplateOutputFileConvention": "{targetDataObject.name}.sql",
415-
"TemplateFilePath": "templateLanding.handlebars",
416-
"TemplateNotes": ""
431+
"TemplateFilePath": "templateDimSelect.handlebars",
432+
"TemplateNotes": "Taken from earlier VDW versions, demonstrating one possible DIM / PIT template."
417433
},
418434
{
419-
"TemplateName": "900 Unit Test - Landing Reconciliation",
420-
"TemplateType": "StagingArea",
421-
"TemplateConnectionKey": "StagingConnectionInternalId",
422-
"TemplateOutputFileConvention": "{targetDataObject.name}_TEST_RECON.sql",
423-
"TemplateFilePath": "templateLandingTestReconciliation.handlebars",
435+
"TemplateName": "Generate Tables",
436+
"TemplateType": "Presentation",
437+
"TemplateConnectionKey": "PresentationConnectionInternalId",
438+
"TemplateOutputFileConvention": "{targetDataObject.name}.sql",
439+
"TemplateFilePath": "templatePresentationGenerateTables.handlebars",
424440
"TemplateNotes": ""
425-
},
441+
},
426442
{
427443
"TemplateName": "Persistent Staging Area Stored Procedure",
428444
"TemplateType": "PersistentStagingArea",
@@ -431,4 +447,4 @@
431447
"TemplateFilePath": "templatePersistentStaging.handlebars",
432448
"TemplateNotes": "This template expects a full copy of incoming data to be placed in a landing area, and performs a full outer join to detects data changes."
433449
}
434-
]
450+
]

Virtual_EDW/Templates/templateDimSelect.Handlebars

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,16 +50,26 @@ FROM
5050
{{/each}}{{#unless @last}} UNION{{/unless}}{{/each}} ) PIT
5151
) TimeRanges
5252
{{#each dataObjectMappings}}{{#each sourceDataObjects}}{{stringcompare dataObjectClassifications.0.classification 'CoreBusinessConcept'}}{{sourceData}}
53-
LEFT OUTER JOIN {{../../../metadataConfiguration.vdwSchemaName}}.{{name}}
54-
ON TimeRanges.{{../../businessKeys.0.businessKeyComponentMapping.0.targetDataItem.name}} = {{../../../metadataConfiguration.vdwSchemaName}}.{{name}}.[{{../../businessKeys.0.businessKeyComponentMapping.0.targetDataItem.name}}]
55-
AND {{../../../metadataConfiguration.vdwSchemaName}}.{{name}}.{{../../../metadataConfiguration.loadDateTimeAttribute}} <= TimeRanges.PIT_EFFECTIVE_DATETIME
56-
AND {{../../../metadataConfiguration.vdwSchemaName}}.{{name}}.{{../../../metadataConfiguration.expiryDateTimeAttribute}} >= TimeRanges.PIT_EXPIRY_DATETIME
53+
LEFT OUTER JOIN
54+
(
55+
SELECT
56+
*,
57+
LEAD ( {{../../../metadataConfiguration.loadDateTimeAttribute}},1,'9999-12-31') OVER
58+
(
59+
PARTITION BY {{#each ../../businessKeys}}{{#each businessKeyComponentMapping}}
60+
[{{targetDataItem.name}}]{{#unless @last}},{{/unless}}{{/each}}{{/each}}{{#each dataItemMappings}}{{#each targetDataItem.dataItemClassification}}{{#if classification}},{{../sourceDataItems.0.name}}{{/if}}{{/each}}{{/each}}
61+
ORDER BY [{{../../../metadataConfiguration.loadDateTimeAttribute}}], [{{../../../metadataConfiguration.sourceRowIdAttribute}}] ASC
62+
) AS [{{../../../metadataConfiguration.expiryDateTimeAttribute}}]
63+
FROM {{../../../metadataConfiguration.vdwSchemaName}}.{{name}}
64+
) {{name}}_inline
65+
ON TimeRanges.{{../../businessKeys.0.businessKeyComponentMapping.0.targetDataItem.name}} = {{name}}_inline.[{{../../businessKeys.0.businessKeyComponentMapping.0.targetDataItem.name}}]
66+
AND {{name}}_inline.{{../../../metadataConfiguration.loadDateTimeAttribute}} <= TimeRanges.PIT_EFFECTIVE_DATETIME
67+
AND {{name}}_inline.{{../../../metadataConfiguration.expiryDateTimeAttribute}} >= TimeRanges.PIT_EXPIRY_DATETIME
5768
{{else}}
5869
INNER JOIN {{../../../metadataConfiguration.vdwSchemaName}}.{{name}}
5970
ON TimeRanges.{{../../businessKeys.0.businessKeyComponentMapping.0.targetDataItem.name}} = {{../../../metadataConfiguration.vdwSchemaName}}.{{name}}.[{{../../businessKeys.0.businessKeyComponentMapping.0.targetDataItem.name}}]
6071
{{/stringcompare}}
6172
{{/each}}{{/each}}
62-
6373
) SUB_TIMELINES
6474
) SUB_CHECKSUM
6575
) SUB_FINAL

Virtual_EDW/Templates/templateHubView.Handlebars

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,7 @@
55
-- The view shows the same data as would otherwise be the case if the table would be created and all data logistics processes run.
66
--
77

8-
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[{{metadataConfiguration.vdwSchemaName}}].[{{generationSpecificMetadata.selectedDataObject.name}}]') AND type in (N'V'))
9-
DROP VIEW [{{metadataConfiguration.vdwSchemaName}}].[{{generationSpecificMetadata.selectedDataObject.name}}]
10-
GO
11-
12-
CREATE VIEW [{{metadataConfiguration.vdwSchemaName}}].[{{generationSpecificMetadata.selectedDataObject.name}}] AS
8+
CREATE OR ALTER VIEW [{{metadataConfiguration.vdwSchemaName}}].[{{generationSpecificMetadata.selectedDataObject.name}}] AS
139
SELECT hub.*
1410
FROM (
1511
{{#each dataObjectMappings}}{{#if @first}}
@@ -33,10 +29,11 @@ SELECT
3329
FROM
3430
( {{/if}}{{/each}}
3531
{{#each dataObjectMappings }}
32+
{{#if enabled}}{{#stringcompare enabled "True"}}
3633
SELECT {{#each businessKeys}}{{#each businessKeyComponentMapping}}
3734
CAST({{sourceDataItems.0.name}} AS NVARCHAR(100)) AS {{targetDataItem.name}},{{/each}}{{/each}}
3835
--{{../metadataConfiguration.recordSourceAttribute}},
39-
MIN({{../metadataConfiguration.loadDateTimeAttribute}}) AS {{../metadataConfiguration.loadDateTimeAttribute}}
36+
MIN({{../../metadataConfiguration.loadDateTimeAttribute}}) AS {{../../metadataConfiguration.loadDateTimeAttribute}}
4037
FROM [{{sourceDataObjects.0.dataObjectConnection.extensions.0.value}}].[{{sourceDataObjects.0.dataObjectConnection.extensions.1.value}}].[{{sourceDataObjects.0.name}}]
4138
WHERE {{#each businessKeys}}{{#each businessKeyComponentMapping}}
4239
{{sourceDataItems.0.name}} IS NOT NULL{{#unless @last}} AND{{/unless}}{{/each}}{{/each}}
@@ -45,6 +42,7 @@ FROM
4542
{{#each businessKeys}}{{#each businessKeyComponentMapping}}{{#each sourceDataItems}}{{#stringcompare isHardCodedValue "True"}}{{else}}{{name}}{{#unless @last}},{{/unless}}{{/stringcompare}}{{/each}}{{/each}}{{/each}}
4643
-- {{../metadataConfiguration.recordSourceAttribute}}
4744
{{#unless @last}}UNION{{/unless}}
45+
{{/stringcompare}}{{/if}}
4846
{{/each}}
4947
) HUB_selection {{#each dataObjectMappings}}{{#if @first}}
5048
GROUP BY {{#each businessKeys}}{{#each businessKeyComponentMapping}}
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
{{#each dataObjectMappings}}
2+
CREATE OR ALTER PROCEDURE [{{targetDataObject.dataObjectConnection.extensions.1.value}}].[SP_{{targetDataObject.name}}]
3+
AS
4+
5+
--
6+
-- Insert Into statement for [{{targetDataObject.name}}] from [{{sourceDataObjects.0.dataObjectConnection.extensions.0.value}}].[{{sourceDataObjects.0.dataObjectConnection.extensions.1.value}}].[{{sourceDataObjects.0.name}}]
7+
--
8+
-- Create using '300 Presentation Daily Snapshot' template.
9+
--
10+
11+
DECLARE @SnapshotEndDate DATE = GETUTCDATE();
12+
DECLARE @SnapshotStartDate DATE = CONVERT(DATE,'2023-10-01'); -- A starting point.
13+
DECLARE @CurrentSnapshotDate DATE = @SnapshotStartDate;
14+
15+
{{! -- Only apply this if the object is a procedure, as identified in the extension -- }}
16+
{{#each sourceDataObjects.0.extensions}}{{#stringcompare key objectType}}{{#stringcompare value procedure}}
17+
DECLARE @TEMP_T TABLE
18+
(
19+
{{#each ../../../dataItemMappings}}
20+
{{targetDataItem.name}} {{targetDataItem.dataType}} {{#if targetDataItem.characterLength}}({{targetDataItem.characterLength}}){{/if}}{{#if targetDataItem.numericPrecision}}({{targetDataItem.numericPrecision}},{{targetDataItem.numericScale}}){{/if}},
21+
{{/each}}
22+
OMD_DELETED_RECORD_INDICATOR CHAR(1)
23+
);
24+
{{/stringcompare}}{{/stringcompare}}{{/each}}
25+
BEGIN
26+
-- Detect what the range of the missing snapshots would be.
27+
SELECT @CurrentSnapshotDate = MAX([SNAPSHOT_DATE]) FROM [{{targetDataObject.dataObjectConnection.extensions.0.value}}].[{{targetDataObject.dataObjectConnection.extensions.1.value}}].[{{targetDataObject.name}}]
28+
29+
PRINT 'The maximum available snapshot date is '+CONVERT(VARCHAR(10),@CurrentSnapshotDate)+'.'
30+
31+
IF (@CurrentSnapshotDate IS NULL)
32+
BEGIN
33+
PRINT 'There is no current snapshot date in the target'
34+
SET @CurrentSnapshotDate=@SnapshotStartDate
35+
END
36+
37+
IF (@CurrentSnapshotDate!=@SnapShotEndDate)
38+
BEGIN
39+
SELECT @CurrentSnapshotDate = DATEADD(DAY, 1, @CurrentSnapshotDate)
40+
PRINT 'The snapshots will be created from '+COALESCE(CONVERT(VARCHAR(100),@CurrentSnapshotDate),'<unknown>')+' up to '+CONVERT(VARCHAR(100),@SnapshotEndDate)+'.';
41+
END
42+
ELSE
43+
BEGIN
44+
PRINT 'The snapshots are up to date.';
45+
GOTO EndOfProcess
46+
END
47+
48+
WHILE @CurrentSnapshotDate<=@SnapShotEndDate
49+
BEGIN
50+
PRINT 'Working on '+CONVERT(VARCHAR(10),@CurrentSnapshotDate);
51+
{{#each sourceDataObjects.0.extensions}}{{#stringcompare key objectType}}{{#stringcompare value procedure}}INSERT @TEMP_T EXEC [{{#each ../../../sourceDataObjects.0.dataObjectConnection.extensions}}{{#stringcompare key schema}}{{value}}{{/stringcompare}}{{/each}}].[{{../../../sourceDataObjects.0.name}}] @SnapshotDate = @CurrentSnapshotDate;
52+
{{/stringcompare}}{{/stringcompare}}{{/each}}
53+
INSERT INTO [{{targetDataObject.dataObjectConnection.extensions.0.value}}].[{{targetDataObject.dataObjectConnection.extensions.1.value}}].[{{targetDataObject.name}}]
54+
(
55+
[SNAPSHOT_DATE]
56+
,[{{../metadataConfiguration.eventDateTimeAttribute}}]
57+
,[{{../metadataConfiguration.changeDataCaptureAttribute}}]
58+
,[{{../metadataConfiguration.etlProcessAttribute}}]
59+
,[{{../metadataConfiguration.loadDateTimeAttribute}}]
60+
,[{{../metadataConfiguration.recordChecksumAttribute}}]
61+
{{#each dataItemMappings}}
62+
,{{stringwrap targetDataItem.name "[" "]"}}
63+
{{/each}}
64+
)
65+
SELECT
66+
@CurrentSnapshotDate AS [SNAPSHOT_DATE]
67+
,GETUTCDATE() AS [{{../metadataConfiguration.eventDateTimeAttribute}}]
68+
,[{{../metadataConfiguration.changeDataCaptureAttribute}}]
69+
,0 AS [{{../metadataConfiguration.etlProcessAttribute}}]
70+
,[{{../metadataConfiguration.loadDateTimeAttribute}}]
71+
,HASHBYTES('MD5',
72+
ISNULL(RTRIM(CONVERT(NVARCHAR(MAX),{{../metadataConfiguration.changeDataCaptureAttribute}})), 'N/A') + '#~!' +{{#each dataItemMappings}}
73+
ISNULL(RTRIM(CONVERT(NVARCHAR(MAX),{{targetDataItem.name}})), 'N/A') + '#~!'{{#unless @last}} +{{/unless}}{{/each}}
74+
) AS [{{../metadataConfiguration.recordChecksumAttribute}}]
75+
{{#each dataItemMappings}}
76+
,{{stringwrap sourceDataItems.0.name "[" "]"}}{{sourceDataItems.0.dataQueryCode}}
77+
{{/each}}
78+
{{! -- Only apply this if the object is a procedure, as identified in the extension -- }}
79+
{{#each sourceDataObjects.0.extensions}}{{#stringcompare key objectType}}{{#stringcompare value procedure}}
80+
FROM @TEMP_T;
81+
DELETE FROM @TEMP_T;
82+
{{/stringcompare}}{{/stringcompare}}{{/each}}
83+
{{! -- Only apply this if the object is a function, as identified in the extension -- }}
84+
{{#each sourceDataObjects.0.extensions}}{{#stringcompare key objectType}}{{#stringcompare value function}}FROM [{{../../../sourceDataObjects.0.dataObjectConnection.extensions.0.value}}].[{{../../../sourceDataObjects.0.dataObjectConnection.extensions.1.value}}].[{{../../../sourceDataObjects.0.name}}] (@CurrentSnapshotDate) bc
85+
{{/stringcompare}}{{/stringcompare}}{{/each}}
86+
87+
SET @CurrentSnapshotDate = DATEADD(DAY,1,@CurrentSnapshotDate);
88+
END
89+
90+
EndOfProcess:
91+
PRINT 'Process finished.';
92+
SELECT @@ROWCOUNT AS ROWS_INSERTED;
93+
END
94+
GO
95+
{{/each}}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{{#each dataObjectMappings}}{{#if @first}}
2+
--
3+
-- Table creation statement for {{targetDataObject.name}}
4+
--
5+
6+
IF OBJECT_ID('[{{targetDataObject.name}}]', 'U') IS NOT NULL
7+
DROP TABLE [{{targetDataObject.name}}];
8+
9+
CREATE TABLE [{{targetDataObject.name}}]
10+
(
11+
{{#each dataItemMappings}}
12+
[{{targetDataItem.name}}] [{{targetDataItem.dataType}}]{{#stringcompare targetDataItem.dataType "int"}}{{else}}{{#stringcompare targetDataItem.dataType "nvarchar"}}(1000){{else}}{{#stringcompare targetDataItem.dataType "datetime2"}}(7){{else}}{{#stringcompare targetDataItem.dataType "decimal"}}{{else}}{{#stringcompare targetDataItem.dataType "binary"}}(16){{else}}({{characterLength}}{{#stringcompare targetDataItem.dataType "numeric"}}{numericPrecision}},{{/stringcompare}}{{numericScale}}){{/stringcompare}}{{/stringcompare}}{{/stringcompare}}{{/stringcompare}}{{/stringcompare}},
13+
{{/each}}
14+
[SNAPSHOT_DATE] [datetime2](7) NOT NULL,
15+
[{{../metadataConfiguration.etlProcessAttribute}}] [int] NOT NULL,
16+
[{{../metadataConfiguration.loadDateTimeAttribute}}] [datetime2](7) NOT NULL,
17+
[{{../metadataConfiguration.changeDataCaptureAttribute}}] [nvarchar](100) NOT NULL,
18+
[{{../metadataConfiguration.eventDateTimeAttribute}}] [datetime2](7) NOT NULL,
19+
[{{../metadataConfiguration.recordChecksumAttribute}}] [binary](16) NOT NULL,
20+
){{/if}}{{/each}}

0 commit comments

Comments
 (0)