Changes
Beta: The data service is published as a beta version. Features, configuration, and interfaces can change before the first released version.
What changes for users, operators, and programs. The data service is published as a preview and
doesn't have a released version yet, so this file lists dated preview updates and the versions of the
contract package Wkl.Data.Gateway.Contracts, which programs and the .NET client consume. When the contract gains
something new, reference pages name the version it applies from („since contract 0.x“).
2026-11-05 – Request identifiers in the session context (contract unchanged)
- Session context for every request: Besides
wkl.person,wkl.key, andwkl.role, the service now writes, read-only and for every request,wkl.client(caller),wkl.method(sign-in method),wkl.alias,wkl.request(correlation ID as in the access log), andwkl.rules(all of the caller's rules), pluswkl.rule(the access rule that allows the resource),wkl.session(second-factor session), andwkl.person_id(the person's number in administration). Previously there were values only for a personal key and a chosen identity; now also for a service key, a Windows account, and a SQL Server login. - Assignment by the person's number: A view that filters rows by person should compare with
wkl.person_idrather than the name; the number stays the same when the person is renamed. See Row-level restriction and Restrict agents to their customers. - Providers: Provider contract 1.8, provider for SQL Server 1.9.0. A provider for an earlier contract keeps working and doesn't write the new values.
2026-11-05 – License (interface unchanged)
- License: The service reads its license (a
.licfile from the purchase at wvds.it) without a network and without activation, preferably from%PROGRAMDATA%\WKL\Licenses\. It checks at start and every hour and writes the result to Event Viewer (event IDs 9100 to 9109). Without a valid license it keeps working fully: a 30-day evaluation, then a notice in the log. Callers see none of it. See Store the data service's license.
2026-11-04 – Files named after the service (contract unchanged)
- Failed update: If an update fails, the previous version runs as before: registered, with its configuration, its firewall rule, and its store. Previously it was left without configuration and registration, and the service didn't start.
- Administration store: New installations create the store as
dbgwsvc.dband the log file asdbgwsvc-logs.db; previouslygateway.dbandgateway-logs.db. An update renames the existing files in the data folder; if the update is rolled back, the files get their former names back. A store configured elsewhere by hand (Gateway:Store:Path) keeps its name. - Backups:
backup-store --to-folderand the backup from the administration app name the copy after the store, that isdbgwsvc-<time>.db; backups with the former name stay valid. - Helper scripts in the program folder:
dbgwsvc-Erster-Administrator.cmdanddbgwsvc-Zertifikat-LetsEncrypt.cmd, previously withoutdbgwsvc-. - WKL Database Update service: The program is
dbgwupd.exe, previouslyWkl.Data.Update.exe; commands read, for example,dbgwupd.exe status kunden. The Windows service keeps its nameWkl.Data.Updateand so its accountNT SERVICE\Wkl.Data.Update; that account's database logins stay valid.
2026-11-03 – Invitation mails with the partner's logo (contract unchanged)
- Built-in mail templates: The three built-in templates have a light header with the partner's logo (
src="cid:brand") and the mark of The White Knight Labs at the bottom (src="cid:logo"); the client attaches both images. The administration store now has schema version 28: at startup, every built-in template that still has the previously shipped text gets the new one; a template that an administrator changed stays as it is.
2026-11-03 – Request limit that refills, with Retry-After; audit kept a year (contract unchanged)
- Request limit: The budget per caller refills continuously (
RateLimit:PerCallerperWindowSeconds, by default 1,200 a minute, that is 20 a second) instead of all at once at the end of a fixed period; after a pause up toRateLimit:Burstrequests are free at once (default 600). A caller that keeps working is slowed to the rate instead of being refused until the minute ends. Every429of the limit says inRetry-Afterwhen the next request passes; the ODBC driver from 0.8.2 on waits that long and continues reading. - Audit:
Gateway:AuditLog:Daysdefaults to 365 days (previously 90); that covers, for example, the six months Slovenia's ZInfV-1 requires for security logs. When the log file reaches its size, the service removes the oldest entries first; see Configuration. - Retention and file size in the administration: the settings
audit_days(1–3650 days) andlog_max_megabytes(64–65,536 MB) of theSettingsset take precedence overGateway:AuditLog:DaysandGateway:Store:LogMaxMegabytesand apply without a restart; a value outside the limits is refused with a message.ServiceStatusnow includesLogMaxMegabytes. The administration store moves to schema version 27; it converts itself at startup. GET /odata/v4without an alias: The list of aliases comes back with 200 again; before, the service answered 400 and wrote an exception to its log.- Program file
dbgwsvc.exe: The service's program is nameddbgwsvc.exe(withdbgwsvc.dll) instead ofWkl.Data.Gateway.exe; you call every command with it, for exampledbgwsvc.exe init-admin. The update replaces the old file and the path in the service. The service name, service account, data folder, and event source stayWkl.Data.Gateway.
2026-11-02 – Connection test and messages with umlauts (contract unchanged)
- Connection test: For a SQL Server on the same computer, a missing login or database is now reliably reported as such (18456 or 4060), no longer as network error 233. After 233 the test tries again at once and then a third time after 250 ms; a server that is really unreachable costs 250 ms more.
- Messages: The service's messages, hints, and output now spell German umlauts and ß as such („Schlüssel“, „lässt“, „für“) instead of „ae“, „oe“, „ue“, „ss“. Programs that compare a message text should evaluate the HTTP status code or the
codefield, not the text. Audit values such as „geaendert“ or „geloescht“ stay unchanged.
2026-11-01 – Page size as the client prefers (contract unchanged)
- The OData surface honors
Prefer: odata.maxpagesize=nfor a read without$top: pages up toMaxTop, confirmed inPreference-Applied, next pages as before. A client that reads only keys needs a tenth of the requests. Without the header, nothing changes.
2026-11-01—Newest change log entries faster (contract unchanged)
- A range of the key of an administration set, ordered by the key, is now read in the administration store. An example is
ChangeLog?$filter=Id le 62030&$orderby=Id desc. Before, the service read the whole table for every window. With 62,000 entries that cost about 1.5 s per window, and the newest 1,000 entries over the ODBC driver took 3.4 s. - Results and their order stay the same. The service answers other conditions in memory, as before.
2026-11-01—Audit: refusals only before the cap (contract unchanged)
- A query of
AuditEntrieswithReason ne null(refused requests only) now narrows the log file itself, like the period and the person already did. The cap of 20,000 entries per query then applies to the refusals; before, older refusals could be missing when newer served requests filled the cap (for example in a person's refusals in the administration app when the person has many requests).
2026-11-01—Status names the retention of the logs (contract unchanged)
- The administration set
ServiceStatusnames how far back the logs reach:AuditDays(retention of the access log),AuditOldestAt(oldest access kept), andSignInEventDays(retention of the sign-in events). An administration app can use them to name the span of a log page instead of writing „since the service started“.
2026-11-01—Keys with a slash (contract unchanged)
- An entry whose key contains a slash (such as the network range
10.0.0.0/8of a sign-in rule, or a path) can now be read, changed, and removed through its address. The slash arrives encoded as%2F; the service didn't find the entry and answered404, which Access reported as a write conflict (error 3197). This applies to the administration and to the data interface. A value that itself contains the characters%2Fstays unchanged.
2026-11-01—Row version without values of other sets (contract unchanged)
- The row version (
Version) of a set now covers only the values of the row itself. Numbers and names from other sets (Persons.Rules,ClientRules.Holders,PersoninPersonRules,PersonalKeysandSessionTokens,DataSourceandRoleof the identity assignments) no longer change it. Before, deleting a person right after deleting its rules ended in Access with a write conflict (3197), and so did an edit while someone assigned a rule.
2026-10-31—Last sign-in and exit date per person (contract unchanged)
Personshas the fieldsLastSignInAtandLastSignInMethod(last successful sign-in, read-only) andLeftAt(exit date, set by the administration). Dormant accounts and the time from exit to lock can be shown with them. The administration store gets schema 26.
2026-10-31—Sessions end with a reason and who ended them (contract unchanged)
SessionTokenshas the fieldsEndReasonandEndedBy: how a second-factor session ended (ended in the administration, person locked, key revoked, second factor set up again or removed, expired) and who ended it. When the administration locks a person or revokes a key, their sessions end in the same step. Sessions are no longer deleted when the second factor is set up again or removed. The administration store gets schema 25 for this.
2026-10-31—Access log names the record and the allowing access rule (contract unchanged)
AuditEntrieshas two new fields:Targetnames what a request addressed (path and query, such as…/Vertraege(17)or…?$filter=Nr eq 17), andAccessRulenames the access rule that allowed an answered request to a table or view, with its version.ClientRulesshows each rule's current version inRuleVersion. An existing log file gets the columns at startup; older entries leave them empty. See How to trace an access decision.
2026-10-30—Software bill of materials in the package (contract unchanged)
- The installation program and the MSI package place
sbom.cdx.jsonin the program folder: the software bill of materials (SBOM) in CycloneDX 1.6 format, with every installed file and its checksum and the third-party components it contains. Every delivery also includes it asWkl.Data.Gateway-<version>.sbom.cdx.json. See Installation package.
2026-10-30—Connection test reports a refused login to a local SQL Server correctly (contract unchanged)
test-connection: A refused login to a SQL Server on the same computer sometimes arrived as 233 withfailure: Network(„the database server couldn't be reached“), although the login or the database was missing. The test now opens without the connection pool and, after 233, a second time at once; it then reportsLogin(18456) orDatabase(4060). See Administration interface.
2026-10-30—Access log kept across restarts, every log can be turned off (contract unchanged)
- The access log (audit) survives a restart: with an administration store, the service writes it to the log file once a minute and keeps it for
Gateway:AuditLog:Days(default 90 days).AuditEntriesreads from there; before, it held only the last 10,000 entries since start. See Gateway:AuditLog. - Every log can be turned off; all are on by default: accesses with
Gateway:AuditLog:Enabled, the change log withGateway:Store:ChangeLog, and the sign-in and load logs, as before, withGateway:SignInLog:EnabledandGateway:LoadLog:Enabled.
2026-10-30—Installation program in German, English, and Slovenian (contract unchanged)
- The installation program first opens Select language (the Windows display language is preselected) and then shows all pages and messages in German, English, or Slovenian; previously in German only. The suggested installation name follows the language; properties and command line are the same. See Install the data service.
- The MSI package contains the same three languages: dialogs in German, with
TRANSFORMS=:1033in English, withTRANSFORMS=:1060in Slovenian. See Installation package.
2026-10-30—Database names for columns of custom statements (contract unchanged)
- Custom statements: a column without a name (
SELECT COUNT(*) …,SELECT 1 …) or with a name already taken also carries the database's name inlabel(empty, or the repeated name);namestays the key of the values in the rows (Column2,Nummer1). The ODBC driver thus shows the same names as ODBC Driver 18. See HTTP: native API. - SQL Server provider 1.8.0 (requires provider contract 1.7).
2026-10-29—Checked statements with a date part (contract unchanged)
- Checked statements accept the date part in
DATEPART,DATEADD,DATEDIFF,DATENAME,DATETRUNC, andDATE_BUCKET(DATEPART(month, Datum),DATEADD(day, 30, Datum)). Previously, the service rejected them with403(„Die Form 'IdentifierLiteral' …“), although the functions are allowed; they worked with ODBC Driver 18.
2026-10-29—hierarchyid, spatial types, and sql_variant (contract unchanged)
hierarchyid,geography, andgeometrynow appear in the schema document and in every read, as a binary value with the stored bytes—the same ones ODBC Driver 18 returns.sql_variantappears as text in the form of its base type. Until now these columns were missing, and a custom statement with such a column ended in503. See Timestamps, numbers, and names.- OData: a comparison in
$filteror a sort in$orderbyon a column that SQL Server doesn't compare or sort that way (text,ntext,image,xml, spatial types,sql_variant) is rejected by the service with400. Until now the database answered422, and forsql_varianta silently empty result. - Custom statements:
columnsnames the database's type (storeType) and marks an identity column ("identity": true).
2026-10-29—WKL Database Update service (contract unchanged)
- New: the „WKL Database Update“ service with its own installation package
Wkl.Data.Update-<version>.msi. It applies signed database update packages where no data service runs, by the same rules as the update module. Withoutconnection.secret, it signs in with its own Windows account. You administer it on the server withWkl.Data.Update.exefrom an elevated command prompt; see WKL Database Update service (reference). It sends mail on theemailchannel through the mail server named bymailin the protected configuration, always encrypted (TLS on port 465, otherwise STARTTLS). - The update module now accepts protected configurations that start with a byte order mark (UTF-8 with BOM, as Windows PowerShell 5.1 writes with
Set-Content -Encoding UTF8); it used to leave the database out as „not valid JSON“.
2026-10-29—Failed SQL login attempts (contract unchanged)
- An attempt the server gives no readable answer to (
503) now counts as a failed attempt of the SQL login and of its origin. When SQL Server runs on the same machine and is reached over Shared Memory or Named Pipes, the first refusal after the provider was loaded arrived as503instead of401, although the server had checked the password; such attempts used to escape the limit of 5 per login and 20 per origin within one minute. - During a real outage of the server, the service answers
429instead of503after 5 attempts of one login, until the minute is over.
2026-10-29—Protection against changes through other websites (contract unchanged)
- When a browser sends a state-changing request (
POST,PUT,PATCH,DELETE) on behalf of another website, the data service refuses it with403and the codeFORBIDDEN. It relies on the browser'sSec-Fetch-Siteheader; without it,Originmust name the scheme, host, and port of the request. Until now, another website could trigger such requests with the Windows sign-in or a remembered password, which the browser sends automatically. - Programs that aren't browsers (the ODBC driver, the .NET client, Excel, Power BI, scripts) send neither header and aren't affected.
- The body of a state-changing request must carry
Content-Type: application/json(uploaded filesapplication/octet-stream); otherwise the service answers400with the codeBAD_REQUEST. The query options in$queryastext/plainare the exception. The driver, the .NET client, and the administration application already send these types; scripts that send a body without a type (such ascurl -dwithout-H) must add it.
2026-10-28—Database updates in the data service (contract unchanged)
- The update module applies signed database updates to the databases for which the folder `Gateway:Updates` holds a protected configuration: backward-compatible packages at once or after confirmation, breaking ones after an announcement to the running applications, as soon as no older version is still running.
- New administration commands:
update-databases,update-status,update-history,confirm-update,dismiss-update,retry-update,move-update-deadline,cancel-update-notice,upload-update(database updates). - The operating settings per database are kept in the administration store (schema version 21) and changed in the set
UpdateSettings: confirmation for backward-compatible and breaking packages, lead time of the announcement, time window for open sessions. - The module reports what becomes of a package in the event log (event IDs 4101–4106) and, if chosen, in one file per day under
%ProgramData%\Wkl.Data.Gateway\logs\updates(reports); administration store schema version 22. - If chosen, the module also reports by mail, through the service's mail settings (
Gateway:Mail), to the recipients of the database (NotifyEmail,NotifyEmailToinUpdateSettings); administration store schema version 23. - After each backup, the module removes old backups of the same database (
BackupKeepCount,BackupKeepDaysinUpdateSettings) when it can reach the backup folder (backup retention); administration store schema version 24. setup-host(installation package) creates the folderupdatesin the data folder, which only Administrators and System change and the service account reads, and sets it asGateway:Updates:Folder.
2026-10-28—No Windows sign-in behind IIS (contract unchanged)
setup-host --mode iis(installation package withGW_MODE=iis) setsAuthModetoPersonalKey. Before, Windows sign-in was enabled behind IIS as well. It applies to the connection, and IIS with Application Request Routing shares its connections to the service among users, so one person's sign-in could carry another person's request. An existing installation behind IIS loses Windows sign-in when updated; people sign in with their personal key.- If
AuthModecontainsWindowsandTrustedProxiesnames a proxy, the service logs a warning at startup.
2026-10-28—save-person changes only what's given, init-admin checks the methods (contract unchanged)
save-personchanges only what's given for an existing person. Before, without--loginthe command removed the SQL Server login, and without--disabledit enabled the person again. New:--no-login,--no-rulesand--enabled; without--rule, the rules stay.save-personrefuses a rule that isn't in the administration store and lists the existing ones. Before, a typo gave the person no rights, and every later change in the administration failed with422.init-admintakes only a rule that may change the administration with every one of its methods, andadmin-statuscounts only such people as administrators.
2026-10-28—Decimal numbers with up to 38 digits (contract unchanged)
- A value of a
decimalornumericcolumn with more than 28 digits, up to the 38 ofdecimal(38, s), is read and written with every digit. Until now reading such a row failed with503, and writing refused the value with400; an amount with 29 digits was silently rounded to 28 when written.
2026-10-28—Amounts in exponent notation are exact (contract unchanged)
- An amount that the body of a write sends in exponent notation (
1.2345678901234567890E2) reaches a decimal column with all of its digits. Before, it passed through a floating-point number and was rounded to 15 significant digits (123.456789012346). Floating-point and text columns receive the same value as before; procedure arguments are still bound asfloat.
2026-10-27—Connection test reports the server's first answer (contract unchanged)
test-connectionopens the connection exactly once. Until now, after an error such as 4060 (database can't be opened), the database driver tried a second time on its own after 10 seconds, and the test reported what that second attempt returned. That wasn't always the server's answer: a missing database occasionally showed up as network error 233 (failureNetworkinstead ofDatabase). The test now reports the first answer, without the 10-second wait. Requests to the data source still retry.
2026-10-23—Installer: page "Lizenz" (License) (contract unchanged)
- Installer 1.0.8 closed without a message after Weiter (Next) on the page Willkommen (Welcome): the German and Slovenian license texts were missing from the program. From the next installer on, all three versions are included.
2026-10-22—Product name WKL Database Gateway (contract unchanged)
- The data service's product name is now WKL Database Gateway, in every language. The installer, Apps & features, the Start menu, the Windows service's display name, the file properties, and the license, security, and manufacturer information use it.
- The technical name
Wkl.Data.Gatewaystays: the service name, program files, packages, folders, and event source don't change. Scripts and monitoring that use the service name keep working.
2026-10-22—Schema state for the WKL Bootstrapper (contract unchanged)
GET /schema-state/{alias}/{product}returns the schema state of a versioned database, so the WKL Bootstrapper offers only matching application versions; sign-in with Windows, without sign-in only withGateway:SchemaState:Anonymous. See HTTP: native API.X-Wkl-Application: applications report product and version; per alias, the service remembers which version last made a request. See HTTP: native API.- The included SQL Server provider has version 1.3.0.
2026-10-22—Manufacturer information, third-party notices, signing (contract unchanged)
- Manufacturer EMSR DATA, D.O.O. File properties, package, installer, and „Programs and Features“ name the company EMSR DATA, D.O.O. instead of „The White Knight Labs“, together with contact and website. Identifiers stay the same: service name
Wkl.Data.Gateway, program folder, package IDs; an update recognizes the existing installation. - New files in the program folder.
THIRD-PARTY-NOTICES.txtwith the third-party components and their licenses, the notices of the .NET runtimes,SECURITY.md(reporting vulnerabilities, supported versions), andMANUFACTURER.md(manufacturer information), the last two in English, German, and Slovenian; see Installation package. - License terms. The installer and the package show the license terms of EMSR DATA before installation; you can continue only after accepting them. They are in the program folder and in every NuGet package as
LICENSE.md(binding, English),LICENSE.de.md, andLICENSE.sl.md; see Install the data service. - All of the product's own libraries signed. Besides the program, the package, and the installer, every library of the product (
Wkl.*.dll), including the providers, is now signed in a delivery.
2026-10-21—The administration interface no longer announces grouping (contract unchanged)
- The administration
$metadatano longer hasAggregation.ApplySupported. The administration interface rejects$applybut announced it, so the ODBC driver sentMAX,SUM,COUNT(column)and groupings (for example fromDMaxin Access) as requests that failed with400. Now the driver rejects them itself;DCount("*", …)counts as before. What is counted and how to read the highest value: Counting, highest value and grouping.
2026-10-21—Existing win-acme for Let's Encrypt (contract unchanged)
- An existing win-acme orders and renews. If the machine already renews with another copy of win-acme (version 2.2.9 or later), the order uses it, and its task stays; an older version stops the order with a message. On removal, win-acme's task goes only if it starts the bundled win-acme. See Installation package.
2026-10-21—Service account login in SQL Server from the installer (contract unchanged)
- New „SQL Server“ step in the installer. It writes a script for the database administrators to the data folder (default), or creates the service account's login and a user per database right away, with the Windows account of the person installing. Anything that exists stays unchanged. See Install the data service.
- New command
service-loginfor the same after the installation, plussetup-host --sql-serverand the package propertiesGW_SQL_SERVER,GW_SQL_DATABASES, andGW_SQL_ROLESfor software distribution. See Commands.
2026-10-21—No Server header (contract unchanged)
- Answers without
Server: Kestrel. The service no longer names its server software. Behind IIS, an IIS setting removes the header IIS adds itself; see Run the service behind IIS or a proxy.
2026-10-21—Version of sign-in rules and rules from the file that aren't in force (contract unchanged)
RuleVersioninSignInRules. Every stored rule names the version that sign-in events andexplain-sign-inname, so „rule changed since“ is visible without a further call.- New set
SignInFileRules. It shows sign-in rules that are still in the configuration file but aren't in force with an administration store (InForce=false). Described under administration.
2026-10-20—Sign-in rules by network operator, program and time window (contract unchanged)
- New conditions of a sign-in rule.
Operators/ExceptOperators(network operators such asAS3320),Clients/ExceptClients(kind of program from theUser-Agent, claimed by the client) andHours/ExceptHours(time windows such asMon-Fri 06:00-20:00); an exception takesOperators,ClientsandHours. Described under By network operator, program and time. - Your own networks by name.
FromandExceptFromof a rule andFromof an exception may name one of your own networks fromGateway:SignInLog:Networks. - Signals with their reliability. The sign-in event also names
operator,clientand, per signal,trust(observed,claimed,verified) inSignals.explain-sign-intakesoperator,clientandatper origin. - Administration store schema 20.
2026-10-20—Trial mode for sign-in rules (contract unchanged)
- Try a rule. A sign-in rule has a mode:
Enforce(default) orReport. A rule on trial is judged at every sign-in but changes no decision; the sign-in event records what it would have done. Administration store schema 19. Described under Try a rule. - Evaluation per rule. The new set
SignInRuleReportscounts, per rule on trial and version, the sign-ins it would have hit, with the number of people and origins. explain-sign-inshows rules on trial separately undertried.
2026-10-20—Grounds of every sign-in decision in the log (contract unchanged)
- Deciding rule in the sign-in event.
SignInEventsnames, inRules, the sign-in rules the decision was based on, with identifier and version, including a rule an exception lifted, and the administration's lower bound;Signalsnames country and second factor. Described under Grounds of the decision. - Denying rule in the audit.
AuditEntriesnames, inSignInRule, the rule that denied a request; the audit stream writes it after the reason. - Version in
explain-sign-in. The explanation namesidandversionfor every rule, so an earlier event can be compared with the rule as it stands today.
2026-10-20—Providers and connection properties in the administration (contract unchanged)
- Providers in the administration. The set
DataSourcesreads and writesProvider,ProviderVersion, andProviderOptionslike the configuration file (administration store schema 18). The new setsProvidersandProviderPropertiesshow the installed provider packages and the properties each describes for its connection. - Connection as properties. Instead of a string,
DataSourcestakes the connection asConnectionProperties; the provider builds and checks the string from them. When read, the properties appear without the password; a password missing on update is kept. Described under connection properties of a provider. - Connection test with the kind of failure. On failure,
test-connectionnames the database's number (number) and a kind independent of the server's language (failure:Login,Database,Permission,Network,Timeout,Unreadable,Configuration,Other); see connection test and service account. - Service account. New command
GET /admin/v1/service-account: the account under which data sources with Windows authentication sign in to the database, as a SQL Server on the same and on another machine sees it. The installation describes what SQL Server needs for this account. - Provider contract 1.3. Optional description of connection properties and kind of failure of the connection test; a provider for contract 1.2 still loads. The shipped SQL Server provider has version 1.2.0.
- Setup fix: installation name. The setup program didn't pass the installation name you entered on to the installation package; the service got the suggestion „Datendienst (computer name)“ instead, and the authenticator app showed that. From setup 1.0.7, the name you enter arrives. For an existing installation, correct it in the administration with the setting
installation_name(see administration); the new name applies to second factors set up afterward.
2026-10-20—Log file, sign-in patterns over months, stored findings (contract unchanged)
- A log file of its own. The sign-in log and the load log live in a log file next to the administration store (
gateway-logs.db), limited byGateway:Store:LogMaxMegabytes(default 4,096 MB); the oldest entries go first. At the first startup, the service moves existing logs out of the store into it (store schema 17). People are referred to there by their ID; a rename keeps the history. - Individual events without an age limit.
Gateway:SignInLog:EventDaysno longer deletes anything; it only sets how far backSignInOriginsandSignInEventsread without a time condition of their own.SignInEventsreads conditions onPerson,At, andIdfrom the log file; the limit of 20,000 applies per request to what matches. - Sign-in rules with a memory. Ten rules compare each sign-in with the previous 90 days and store findings with a stable
Idin the new set `SignInFindings`; „since the last look“ isId gt x. Without thesign-in-eventsright, person, key, and comparison values stay empty. - Reporting findings. Findings at level
actappear as warnings in the service log and, withGateway:SignInLog:Alerts:Recipients, go out by email right away; findings at levelaskgo out once a day as a digest. New section `Gateway:Mail`. - Sign-in profile. New command `sign-in-profile`: what is usual for a person over 90, 180, 365, or more days.
- Stored load hints. New set
LoadFindingswith a stableId, filled hourly from the hints ofLoadAdvice. - Backup.
backup-storebacks up the log file too (…-logs.dbnext to the copy of the store); the response of the HTTP command also nameslogFileandlogBytes.
2026-10-19—People with traces are only disabled (contract unchanged)
- Deleting a person with traces is refused. If a person has a personal key or a session, entries in the sign-in log or the load log, or wrote changes themselves,
DELETEonPersonsreturns422; the person can only be disabled (Enabled = false). This keeps the logs attributable to a person. See Retention and deletion.
2026-10-19—Sign-in rules by country, administration store schema 16 (contract unchanged)
- Rules by country. Sign-in rules name countries (
Countries,ExceptCountries, ISO 3166-1 alpha-2 codes), for example „data access only from Germany“. The service reads the country from the geolocation database of the sign-in log. A country that can't be determined falls within the scope of the rule; exclude your own networks by their addresses. See sign-in policy. - Exceptions with an end.
Exceptionsspares requests that meet all attributes at once (people, Windows groups, countries, networks) until an end in UTC—for example one person also from Thailand for two weeks. The end appears in the change log (exception-lapsed). - Administration API. New sets
SignInRuleExceptionsandSignInRuleExceptionItems, new attributescountryandexcept_country;save-sign-in-ruleacceptscountries,exceptCountriesandexceptions;explain-sign-innames the country and the sparing exception and accepts a country per origin. New reasondeniedByCountryin the sign-in log. - Administration store schema 16. The service converts a store at first start and backs it up first.
2026-10-19—Load log, administration store schema 15 (contract unchanged)
- Load log. For each shape of request—the request without its values—the service records how often it came, how long it took in the service and in the database, how many rows and bytes it returned, and how often it failed. New sets
LoadShapes,LoadHours,SlowRequests,LoadAdvice, and, only with the newload-personsright,LoadPersons. Settings under `Gateway:LoadLog`. See Investigate what loads the service and the database. - Advice with remedies.
LoadAdvicenames shapes that load the database regardless of the data: whole tables without a filter, filters without an index, deep paging, expensive totals and aggregates, expensive own statements, and very frequent automatic refresh. - Load for the manufacturer.
export-load(an administration command and a server command) writes shapes, hourly figures, and advice as a JSON file, without persons, origins, or values. - Finding a shape in SQL Server. Generated and checked statements carry the comment
/* wkl:<shape identifier> */after their first keyword, visible in the plan cache, in Query Store, and in Extended Events; the connections identify themselves asWkl.Data.Gatewayunless the connection string sets anApplication Nameof its own. - Provider contract 1.2, SQL Server provider 1.1.0. The contract passes the identifier to the provider (
ExecutionLimits.Marker) and reads back the last generated statement (IDataSession.LastStatementText). Both are additions; a provider for contract 1.0 or 1.1 runs unchanged, just without the marking. - Administration store schema 15. The service upgrades an older store on first start; a backup is created as with every upgrade.
2026-10-19—Sign-in log with origins, administration store schema 14 (contract unchanged)
- Sign-in log. The service records every sign-in decision with its method, outcome, reason, person, and origin in the administration store and evaluates it: distribution by hour and weekday in server time, origins by named network, country, and network operator, and hints at attack patterns. New sets
SignInHours,SignInOrigins,SignInEvents,SignInAdvice; the individual events require the newsign-in-eventsright. See Check sign-in patterns and origins. - Geolocation database without outbound lookups. The service locates addresses with files on the server (DB-IP Lite or MaxMind GeoLite2). It downloads them itself (
update-geoip, also on a schedule), accepts them from a client (upload-geoip), or on the server (import-geoip). New setsGeoIpFiles,GeoIpSource, commandset-geoip-source, settings `Gateway:SignInLog`. - „Denied“ in the service status without challenges.
DeniedLastFiveMinutesincluded the401answer to a request without credentials, with which every Windows sign-in starts. A deployment with Windows sign-in therefore showed refusals all the time although nothing was refused. - Reason
unprotected. A SQL Server login, a second-factor code, or a request to the administration or self-service over an unprotected connection now carries this reason (previously none) and shows up in the sign-in log. - Administration store schema 14. The service upgrades an older store on first start; a backup is created as with every upgrade.
2026-10-18—Replay protection, writing, and running behind a proxy (contract unchanged)
- Replay protection under a renamed key header. With a custom
Gateway:Security:ApiKeyHeader, the service didn't tell callers apart forIdempotency-Key: a second caller with the sameIdempotency-Key, address, and body could receive another caller's stored response. Each stored response now belongs to its caller. - Columns of unsupported types no longer accept values.
sql_variant,hierarchyid,vector, and CLR types are missing from$metadatabut accepted values when writing. The service now responds400, as for an unknown field. - SQL Server sign-in with an administration store can be set up in any order. The service starts with
SqlLogininAuthModeeven before a data source accepts SQL Server logins and a mapping exists; until then, it logs a warning that points to the administration, and a sign-in with name and password ends with401. See Set up sign-in with a SQL Server login. - Addresses in responses behind a proxy. From a trusted proxy, the service takes
X-Forwarded-ProtoandX-Forwarded-Hostfor the absolute addresses in its responses (service document, next pages,Location, one-time links); the IIS template sets both headers. See Run the service behind IIS or a proxy. - First administrator with a Windows account.
init-admin --windowsnow assigns the account to the administration rule. Before, the Windows sign-in got no rights: with--no-key, the command created an administrator who couldn't sign in, andadmin-statusstill counted that person as able to administer. Resting keys on demand no longer count there either. - Changing the access. When
setup-hostruns over an existing administration store, it now says that the sign-in rules of the new access don't apply there. With no corporate networks entered, the firewall rule now admits only the local subnet instead of every network.
2026-10-16—Complete OData pages and writing next to spatial data (contract unchanged)
- A window is never larger than
Limits:MaxRows(also per object). Previously, with a smallerMaxRows, an OData page ended without@odata.nextLinkand without any indicator; Access, Excel, and Power BI took part of the rows for the whole result. - Columns of types that aren't offered (spatial types,
hierarchyid,sql_variant,json,vector, CLR types) are now also left out when reading without a field list and when reading back after a write. Previously, writing to a table with ageographycolumn answered503although the row was saved, and the native route without a field list returnedsql_variantraw. If you read these values through the native route without a field list, you no longer get them.
2026-10-16—Documentation: new pages and corrections (contract unchanged)
New: Security model and trust boundaries,
Standards and specifications.
Corrected: a person with a personal
key and no SQL Server login also runs under the alias's login on an alias with
Persons: Impersonate (no 403); the service sets wkl.person only for personal keys and chosen
identities; DenyImpersonate doesn't apply to sign-in with HTTP Basic; over OData, a timestamp with
an offset is converted to UTC instead of being refused; 503 after a write request means „outcome
unknown“; /health/ready also answers 200 without an alias. The behavior of the service is
unchanged.
2026-10-16—Checked statements (contract unchanged)
Callers without the sql right can send statements to POST /api/v1/cf/{alias}/sql.json that the
service checks: joins, subqueries, UNION, functions, CASE, LIKE patterns with _ and […],
set-based changes, and calling a procedure—over exactly the objects and with exactly the methods
their rules allow. Several statements in one batch are allowed; each is checked on its own. As a
result, the queries Access sends over linked tables run through the ODBC driver even without the
sql right. New in the configuration: AllowCheckedStatements per data source (default true);
at startup, the administration store switches to schema version 13 and applies the default to all
existing data sources. The schema document now also names the address (Store.PassThrough) to these
callers. Provider contract 1.1: IDataSource.CheckStatement, capability CheckedStatements; the
bundled sqlserver provider requires contract 1.1.
New at the same address: output and return parameters (outputs in request and response), all
result sets (results after the first one), and describing a statement without running it
("describe": true), see
Output parameters, multiple result sets, describing.
Responses without these fields remain unchanged. Provider contract 1.1: capabilities
StatementOutputs and StatementDescription.
2026-10-16—Databases through providers (contract unchanged)
The service connects databases through loadable providers. The sqlserver provider is bundled
(folder providers/sqlserver/1.0.0 next to the program); responses to callers remain unchanged.
New in the configuration: Provider,
ProviderVersion, ProviderOptions per data source and Gateway:Providers:Path, see
Service configuration (reference). Dialect: mssql still applies.
If a data source lacks a capability, the service refuses the request with 400 before it contacts
the database.
2026-10-15—Documentation reorganized (contract unchanged)
The administrator's guide of the administration app and the reference of the VBA class
DbGwClient now belong to the documentation of the administration app (separate repository
Wkl.Data.Gateway.Access). The tasks on the server—installation, first administrator, backup,
master key, emergency access—are here in the new Operations section.
2026-10-15—Administration store, schema 12 (contract unchanged)
- Invitations by email: email templates in the
MailTemplatesset (three built in), an email address on the person (Email), and one-time links by email ("delivery": "mail"forissue-keyandenroll-totp) that survive a restart and hold no secret; settingmail_link_hours, configurationGateway:Store:MailLinkHours. See One-time link by email. - A store of an older version is converted at startup (backup
.v11-…bakfirst).
2026-10-14—Contract 0.6.0
- New error kind
DATABASE_UNREADABLE(503): SQL Server is reachable but can't read the alias's database (drive lost, offline, suspect, recovering). Not considered transient. Previously the response wasUNAVAILABLE; a caller that doesn't know the code still reads 503.
2026-10-13—Contract 0.5.0
- Error responses carry the messages from SQL Server (
details: number, SQLSTATE, severity, text,released). Number, SQLSTATE, and severity always arrive, as over a direct connection; the service withholds the text (released: false) if it names an object the caller can't reach, or if, under the data source's login, it can quote a data value (such as a duplicate key or a value that's too long). See Error format.
2026-10-07—Contract 0.4.0
- Filters can compare one field with another field (
GatewayFilter.FieldComparison).
2026-09-24—Contract 0.3.0
- New error kind
TIMEOUT(504): the statement exceeded the service's time limit. Previously the response wasUNAVAILABLE(503).
2026-09-23—Contract 0.2.0
- A membership check may carry up to 20,000 values (previously 1,000).
2026-08-03—Contract 0.1.0
- First version.