Database architecture
UserLock relies on a central database to store activity logs. Understanding how this database works and which technologies are supported helps administrators make informed choices for performance, reliability, and long-term maintenance.
UserLock continuously records information such as:
session and authentication events,
user status changes,
administrator actions,
configuration changes.
A central database ensures this information is preserved, queryable, and consistent across the whole deployment.
Since UserLock 13.1, the default database is SQLite. A new installation stores its data in a single local SQLite file (UserLock.db) on the UserLock server and starts recording immediately.
This option is designed for simplicity:
zero configuration: no database server to install, no driver to deploy, no credentials to manage,
single local file: the whole database is one file on the UserLock server, easy to include in the server's backups,
access is controlled by the file system permissions of the UserLock server.
Use case
👉 Suitable for evaluation and for production in small and medium environments. For large volumes, shared access between the primary and backup servers or remotely access from administration consoles, see Choosing a database.
UserLock supports five database types. The drivers they need are installed automatically with UserLock: no manual driver installation is required.
Database | Supported versions | Maximum size | Notes |
|---|---|---|---|
SQLite (default) | Included with UserLock | Limited by disk space | Zero configuration, single local file. |
Microsoft SQL Server | 2005 and newer, 32/64-bit | No theoretical limit | Recommended for scalability, resilience and enterprise integration. |
Microsoft SQL Server Express | 2005 and newer, 32/64-bit | 10 GB | Most SQL Server features, with CPU and RAM limitations. Cost-effective and robust enough for production in SMB environments. |
MySQL | 5.6 and newer | Depends on the MySQL server | Drivers installed automatically; MySQL is available in the database type list. |
Microsoft Access (legacy) |
| 2 GB | Kept for compatibility only. Migration to SQLite is recommended. |
Note
LocalDB editions of SQL Server are not compatible with UserLock.
In versions earlier than 13.1, the default database was a Microsoft Access file (UserLock.mdb). Access is now a legacy database type: it remains supported for compatibility, so existing installations keep working after the upgrade.
Access has structural limitations:
maximum file size of 2 GB,
limited performance and scalability,
not resilient for long-term or production use.
When the current database is an Access file, UserLock offers to migrate it to SQLite. Do not choose Access for new deployments.
Note
For the migration steps in the console, see Server settings ▸ Database.
SQLite is suitable for production in trials and small environments. Choose SQL Server (or SQL Server Express, or MySQL) if you expect a high volume of events, if the primary and backup servers need to share a central database server, or if you need to access the database remotely from administration consoles.
Note
The primary and backup servers each need their own database. They can share the same database server, with a different database name for each UserLock server.
UserLock introduces a new .NET insertion engine (ADO.NET) that writes events to the database. With this engine, no event is lost when the database is temporarily unavailable:
Events generated while the database cannot be reached are kept by UserLock.
They remain kept even if the UserLock service restarts in the meantime.
As soon as the connection is restored, UserLock inserts them into the database.
Note
After an upgrade to 13.1, an existing database connection keeps using the previous ODBC insertion engine until its connection settings are regenerated with the database wizard in Server settings ▸ Database. This step activates the new .NET engine, which SQLite requires.
UserLock deployments frequently evolve over time. Common migration needs include:
moving from Access to SQLite (offered by the console when the current database is an Access file),
moving from SQLite or Access to SQL Server (when event volumes grow or the primary and backup servers need a central database server),
moving from one SQL Server to another (infrastructure change, upgrade, or disaster recovery).
Migrations between any supported database types are performed with the database wizard, keeping data and history intact. See Migrate the UserLock database.
If you need help to deploy SQL Express, follow the guide on how to install and configure SQL Express.
Use SQLite (default) for small and medium environments, and SQL Server (or SQL Server Express, or MySQL) for large volumes or when the primary and backup servers rely on a central database server.
Do not use Microsoft Access for new deployments; migrate existing Access databases to SQLite.
Do not use SQLite if you plan to access the database remotely from administration consoles. We recommend using SQL Server (or SQL Server Express, or MySQL).
With SQLite, include the database file in the UserLock server's backups.
With SQL Server or MySQL, host the database on a backed-up server.
Monitor database growth and plan maintenance (archiving, purging old logs).
Test migrations in a staging environment whenever possible.
Work with your DBA team to align with corporate standards and backup policies.
Note
For detailed configuration options in the console, see Server settings ▸ Database.
The UserLock database is composed of four tables:
the UserLogonEvents table to record session events,
the UserStatus table to record User status,
the AdminActions table to record administrator action,
the AdminActionResults table to record results related to administrator actions.
You can find below a list of the fields included in these tables, showing their type and their purpose.
This information is provided for transparency and integration purposes.
Note
The UserLock database is openly accessible to allow integration and reporting on collected data. However, we strongly recommend not altering the schema or content.
Field name | Data type | Field description |
|---|---|---|
EventType | integer | Interactive sessions Wi-Fi / VPN sessions IIS sessions SaaS sessions UAC events |
EventTime | date time | Date and time of the logon/logoff event |
UserAccount | string | User account name |
UserDomain | string | User domain |
UserFullName | string | User full name |
ComputerName | string | Logged on workstation or terminal server |
ComputerSession | integer | Terminal session identifier |
ClientName | string | Logged on workstation or terminal |
ClientAddress | string | Workstation or terminal IP address (MAC address for Wi-Fi sessions). |
SessionId | string | Session identifier |
SubSessionId | integer | Sub session identifier. Increased by 1 after each unlock event (new sub session) |
Status | integer | 0: For all session events, except for the cases below.
3: For interactive session logoff events automatically recorded after a shutdown or crash of the computer on which the session was running. |
ErrorId | string | Not null only if the session event could not be notified in real time to the UserLock server. This can happen in the following cases:
|
LastError | integer | Different from 0 only if the session event could not be notified in real time to the UserLock server. See the documentation for the ErrorId field above for more details. |
Param1 to Param6 | string | Dynamic fields used by Wi-fi/VPN/IIS logon/logoff events |
Id | integer | Record id (auto) |
LogonInfo | integer | The meaning of this value depends on the value of the associated EventType value. Detailed reasons for Logon succeeded, when associated 'EventType' = 1, 3, 5, 101, 201 or 501: Detailed reasons for Logon denied by UserLock, when associated 'EventType' = 4, 104 or 204 Logon denied by UserLock can be caused by several reasons. Therefore the value recorded for logon denied by UserLock is a cumulative value. For example, 25 means that group, session and time quota restrictions were applied (1+16+8). Detailed reasons for Logon Denied by Active Directory, when associated 'EventType' 20, 220 or 420: As logons denied by Active Directory have an exclusive reason, only a single value from this list will be stored. Detailed reason for Logon Denied by Active Directory, when associated 'EventType' 120: |
SessionType | integer | Session Type: |
ServerAddress | string | The IP address of the computer where the session event took place. |
TimeZoneShift | integer | Time difference with UTC (Coordinated Universal Time), in minutes. |
SkipReason | integer | Related to the "Skip" button optionally displayed in the MFA enrollment dialog box. |
Country | string | Country from which the connection was established |
Field name | Data type | Field description |
|---|---|---|
Id | integer | Record id (auto) |
Status | integer | Current status of the user: |
Triggers | integer | Flags of remarkable conditions to help deduce the current status for the user. |
OldStatus | integer | Previous status of the user: |
OldTriggers | integer | Flags of remarkable conditions to help deduce the previous status for the user. |
UserAccount | string | User account name |
UserDomain | string | User domain |
UserFullName | string | User full name |
SessionId | string | Session identifier |
SubSessionId | integer | Sub session identifier. Increased by 1 after each unlock event (new subsession) |
EventType | integer | Interactive sessions |
EventTime | date time | Date and time of the logon/logoff event |
Field name | Data type | Field description |
|---|---|---|
Id | integer | Record id (auto) |
ServerName | string | Server name |
Kind | integer |
|
Action | integer |
|
DateStart | date time | Date time when admin action started |
DateEnd | date time | Date time when admin action ended |
UserAccount | string | User account name initiating the action |
Priority | integer |
|
Severity | integer |
|
DisplayState | integer |
|
UserAccountFullName | string | User account full name initiating the action |
Domain | string | Domain name |
Field name | Data type | Field description |
|---|---|---|
Id | integer | Record id (auto) |
ServerName | string | Server name |
AdminActionId | integer | AdminAction identifier |
Item | string | The setting changed by the admin action |
Param1 | string | Dynamic fields |
Param2 | string | Dynamic fields |
Param3 | string | Dynamic fields |
Param4 | string | Dynamic fields |
Param5 | string | Dynamic fields |
Param6 | string | Dynamic fields |
StateResult | integer |
|
Details | string | Details about the admin action |