Error itgenrst007: The metadata of the columns 'partition_code' specifies that null values should not appear, but there is a null value in row #0

Bij het repliceren van een Exact Online administratie naar SQL Server treedt een foutmelding op sinds versie 20.2.126:

2021-11-21 08:42:12.688 Information itgensql264: Invantive SQL statement started.
2021-11-21 08:42:12.821 Warning itgendhb173: Context: insert into xxdru_desired_tables@inmemorystorage ( full_qualif… ( ‘ExactOnlineXML.XML.Costunits’, ‘SELECTED’, null, ‘eol’) )
2021-11-21 08:42:12.855 Error itgencun016: Error itgenrst007: The metadata of the columns ‘partition_code’ specifies that null values should not appear, but there is a null value in row #0.
Ensure that the nullable property in the metadata of XXDRU_DESIRED_TABLES matches the values.
data_container_alias (String/string): eol, full_qualified_name…ition_filter (String/string): SELECTED, rowid$ (Int64/int64): 2
2021-11-21 08:42:14.859 Error itgenrst007: Invantive.Basics.InvantiveSqlException

Het aanmaken van deze tabel gebeurt met:

--
-- List of tables to be excluded.
--
-- The partition filter enables you to specify from what partitions the tables should be taken.
-- Possible values are:
-- * ACTIVE: all active partitions (company on Exact Online), except those listed in
--   xxdru_excluded_partitions.
-- * ACTIVESUB: the first active partition of every owning company
--   (subscription on Exact Online), except those listed in
--   xxdru_excluded_partitions.
-- * SPECIFIC: one specific partition, listed in partition_code.
--
create or replace table xxdru_desired_tables@inmemorystorage
as
select 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
       full_qualified_name
       label 'Fully Qualified Table Name'
,      'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
       partition_filter
       label 'Partition Filter'
,      'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
       partition_code
       label 'Partition Code'
,      'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
       data_container_alias
       label 'Data Container Alias (optional)'
from   dual@DataDictionary
where  false

Daarna worden er zoals zichtbaar in de foutmelding de te laden Exact Online tabelnamen in gezet evenals een aantal filters.

Hoe voorkomen we deze foutmelding?

Verbeterde Afleiding Nullable

In recente versies zoals 20.2.126 zijn een aantal verbeteringen doorgevoerd bij het bepalen of een kolom null mag zijn of niet in queries. Voorheen werd er af en toe onnodig gewisseld van verplicht naar niet-verplicht; dit had geen invloed op de uitkomsten van queries, maar leidde er soms wel toe dat datafouten te lang ongedetecteerd bleven.

Gezien de bedrijfsvisie om correctheid boven handig, tijdig en snel te plaatsen, was een verbetering op zijn plaats.

Door een verbeterde afleiding van onder andere de nullable-eigenschap worden fouten in de datakwaliteit sneller zichtbaar. Dit is vergelijkbaar met het verschil tussen SQL Server en Oracle; SQL Server accepteert soms datafouten zonder een foutmelding, die Oracle niet accepteert.

Soms leiden verbeteringen tot prestatieverslechteringen. In dit geval niet; door de betere afleiding van nullable worden op een aantal platformen nieuwe optimalisatiepaden mogelijk. Denk hierbij aan het optimaliseren van VERPLICHT_VELD is null naar false, en het gebruiken van indexen die geen null kunnen opslaan.

Voorbeeld

Voorheen

Een statement zoals:

create or replace table t@inmemorystorage
as
select 'xxx' c

leverde met oudere 20.2 en 20.0 versies op:

Versie 20.0

Met een tabeldefinitie op zoals:

create or replace table t@inmemorystorage
( c varchar2 null
)

Nieuwe 20.2 Versies

Echter, nieuwe 20.2-versies leveren een tabeldefinitie met betere constraints volgens de definitie zoals:

Versie 20.2

create or replace table t@inmemorystorage
( c varchar2 not null
)

Merk hierbij op dat op dit moment de maximumlengte nog niet ingesteld wordt op 3 voor dit voorbeeld. In een toekomstige release zal dat mogelijkerwijs ook toegevoegd worden.

Case

In deze case zal de tabelstructuur dwingender geworden zijn. Null-waardes zijn niet meer mogelijk voor bijvoorbeeld partition_filter (terecht) en partition_code (waarschijnlijk onterecht).

In het insert-statement is net te zien dat het veld partition_code op null ingesteld wordt, wat nu een technische correcte foutmelding geeft:

Context: insert into xxdru_desired_tables@inmemorystorage ( full_qualif… ( ‘ExactOnlineXML.XML.Costunits’, ‘SELECTED’, null, ‘eol’) )

Advies is om het create table-statement niet meer indirect te laten afhangen van een SQL-statement (wat prima werkt om even vlot een tabel te maken, plus in echt oude versies ook de enige mogelijkheid was om een in-memory tabel te definiëren) en over te stappen op bijvoorbeeld:

create or replace table xxdru_desired_tables@inmemorystorage
( full_qualified_name  varchar2(128) not null label 'Fully Qualified Table Name'
, partition_filter     varchar2(30)  not null label 'Partition Filter'
, partition_code       varchar2(128)     null label 'Partition Code'
, data_container_alias varchar2(128) not null label 'Data Container Alias (optional)'
)

met als resultaat:

Voorbeeld in-memory tabel met DDL