1.3 Data Security Architecture & Section Access Implementation
Key Takeaways
Section Access enforces row-level data reduction and column-level security (OMIT) prior to exposing data in Section Application.
All Section Access system field names and reduction key data values must be authored in UPPERCASE; casing discrepancies cause access denial or unreduced data leakage.
The asterisk (*) wildcard in Section Access grants access only to all values explicitly listed in that reduction field within the security table—it does not grant access to unlisted values or nulls.
Column-level security is enforced using the reserved OMIT system field, which excises specified columns and their underlying symbol tables from restricted user sessions.
Production environments on Qlik Sense Enterprise on Windows by default must provision ADMIN access to the
INTERNAL\SA_SCHEDULERaccount to allow scheduled background reload tasks to execute.
Data Security Architecture & Section Access Implementation
In enterprise analytics, data security is non-negotiable. Organizations must guarantee that confidential financial metrics, patient healthcare records, and regional sales performance are restricted strictly to authorized personnel. In Qlik Sense, this authorization architecture is managed through Section Access.
Section Access provides in-memory, row-level data reduction and column-level security (OMIT), ensuring that users only see data they are permitted to view without requiring separate applications for different user groups.
1. Security Architecture: Section Access vs. Section Application
A Qlik Sense script with data security is split into two distinct execution realms:
Section Access;: The security header of the script. It loads an authorization table containing user identities, access privileges, and reduction keys. When an application is opened, the QIX engine evaluates this table to authenticate the user and reduce the data model.Section Application;: The business logic realm of the script. It loads the associative data model—fact tables, dimension tables, and master calendars. The statementSection Application;terminates the security section and restores standard data loading.
┌────────────────────────────────────────────────────────┐
│ Section Access │
│ - ACCESS (ADMIN vs. USER) │
│ - Identity (USERID, USER.EMAIL, GROUP) │
│ - Data Reduction Key (e.g., REDUCTION_KEY) │
│ - Column Security (OMIT) │
└───────────────────────────┬────────────────────────────┘
│ Hidden associative filter applied
▼
┌────────────────────────────────────────────────────────┐
│ Section Application │
│ - Fact Tables │
│ - Dimension Tables (linked via REDUCTION_KEY) │
│ - Visualizations and Sheets │
└────────────────────────────────────────────────────────┘
The QIX Reduction Mechanism
When an authenticated user opens a Qlik Sense application:
- Identity Resolution: QIX compares the signed-in user with the identity fields in the security table:
USERID(theDOMAIN\USERname supplied by the proxy on client-managed Qlik Sense, or the identity provider subject in Qlik Cloud),USER.EMAIL, andGROUP. - Authorization Lookup: The engine scans the Section Access table for matching credentials. If no match is found, the user receives an immediate "Access Denied" message.
- Privilege Assignment: The user is assigned
ADMINorUSERrights based on theACCESSfield. - Associative Data Reduction: QIX identifies the reduction values associated with that user (e.g.,
COUNTRY = 'US') and applies an internal, permanent selection on that field. Associative propagation instantly filters all connected tables in Section Application. All unselected rows (the "gray" data) are physically excluded from the user's session. - Column Redaction: If the user's record specifies fields in the
OMITcolumn, those fields and their symbol tables are completely excised from the data model for that user session.
2. System Reserved Fields & Authorization Syntax
Section Access utilizes reserved system fields to control authentication, authorization, and data reduction:
| Reserved Field | Description | Allowed Values / Format | Required? |
|---|---|---|---|
ACCESS | Defines the administrative authorization level of the user. | ADMIN or USER | Yes |
USERID | User identifier. On client-managed Qlik Sense it is the DOMAIN\USER name from the proxy (including INTERNAL\SA_SCHEDULER for scheduled reloads); in Qlik Cloud it is compared with the identity provider subject. | String (must be UPPERCASE) | Yes, unless USER.EMAIL is used |
USER.EMAIL | The user's email address. Qlik recommends it in Qlik Cloud for the users who edit and reload the app. | Email address (UPPERCASE) | Alternative to USERID |
NTNAME | Legacy QlikView field. Qlik recommends USERID unless QlikView shares the same security table. | DOMAIN\USERNAME | No (legacy) |
GROUP | Group identifier assigned to multiple users via directory service or IdP. | Alphanumeric string (must be UPPERCASE) | Optional |
OMIT | Identifies specific fields in Section Application to hide from the user. | Exact field name to omit (must be UPPERCASE) | Optional |
| Reduction Field(s) | Custom business fields shared between Section Access and Section Application (e.g., REGION_KEY, DEPARTMENT_CODE). | Values must match data in Section Application (must be UPPERCASE) | Optional (for row-level reduction) |
Differences Between ADMIN and USER
ADMIN: Grants administrative privileges within the application. Administrators bypass sheet-level restrictions, retain access to view and edit the data load script (subject to Qlik Management Console security rules), and can debug data models. However,ADMINusers are still subject to row-level data reduction if reduction field values are explicitly assigned to their account.USER: Grants standard consumer privileges. Users cannot view or modify the data load script, cannot view omitted fields, and are restricted strictly to their reduced data subset.
3. Critical Formatting Rules: Case Sensitivity & Text Handling
Important
The Strict Uppercase Rule: In Section Access, ALL system reserved field names, custom reduction field names, and reduction data values MUST be strictly UPPERCASE.
If a data architect writes:
// INCORRECT: Mixed case will fail or cause access denial
Section Access;
LOAD * INLINE [
Access, UserId, Region
USER, JohnDoe, North
];
This script will fail or deny access. In Section Access, the engine enforces binary ASCII matching. If Region in Section Access contains 'NORTH', but Region in Section Application contains 'North', the values do not match. The associative engine will find zero matching records, locking the user out or presenting completely blank sheets.
Best Practice Transformation Pattern
Always enforce uppercase conversion and trim whitespace on reduction keys in both sections:
Section Access;
LOAD
ACCESS,
USERID,
Upper(Trim(REDUCTION_KEY)) as REDUCTION_KEY
FROM [lib://Security/UserAccess.qvd] (qvd);
Section Application;
Fact_Sales:
LOAD
OrderID,
SalesAmount,
Upper(Trim(RegionCode)) as REDUCTION_KEY
FROM [lib://Data/Sales.qvd] (qvd);
4. Wildcard Reduction Semantics: The Asterisk (*) Rules
One of the most frequently tested topics on the QSDA exam is the exact operational behavior of the asterisk (*) wildcard in Section Access reduction fields.
The Core Rule of the Asterisk
Architectural Definition: An asterisk (
*) in a Section Access reduction field grants access to all values that are explicitly listed in that reduction field within the Section Access table itself. It does NOT inherently grant access to every value existing in the underlying database.
Consider this security configuration:
Section Access;
LOAD * INLINE [
ACCESS, USERID, REGION_KEY
ADMIN, CEO, *
USER, ALICE, NORTH
USER, BOB, SOUTH
];
Section Application;
Fact_Sales:
LOAD * INLINE [
OrderID, REGION_KEY, SalesAmount
1, NORTH, 500
2, SOUTH, 300
3, WEST, 700
];
What does the CEO see?
- The Section Access table explicitly lists only two values for
REGION_KEY:NORTHandSOUTH. - The wildcard
*assigned toCEOexpands strictly to the set{NORTH, SOUTH}. - In
Section Application, Order 3 hasREGION_KEY = 'WEST'. BecauseWESTwas never explicitly declared in the Section Access table, the CEO cannot see Order 3! - To allow the
*wildcard to includeWEST, the architect must ensureWESTexists in the Section Access table (e.g., via a dummy administrative row or an explicit reduction key list).
Handling Nulls in Reduction Fields
In Qlik Sense, NULL values cannot be associated through Section Access. If a fact record has a NULL in the reduction field, no user—not even a user with *—can view that record. If unassigned records must be visible, the architect must replace NULL with an explicit string such as 'UNASSIGNED' in both Section Access and Section Application.
5. Column-Level Security via the OMIT Statement
While row-level security limits which records a user sees, column-level security controls which attributes exist in the user's data model. This is governed by the reserved OMIT field.
Mechanics of OMIT
- When an application opens, QIX reads the
OMITcolumn for the authenticated user. - The engine identifies the named fields and completely strips them from the data model. The field's symbol table and data table pointers are expunged from the user's active RAM session.
- If a user opens a sheet containing a visualization that needs an omitted field, Qlik can show Incomplete visualization for that user.
- Qlik recommends not omitting key fields: an omitted key still appears in the data model viewer without content, which confuses users.
Syntax for Multiple Omitted Fields
To omit multiple fields for a single user or group, the architect must declare multiple distinct rows in Section Access, one for each omitted field:
Section Access;
LOAD * INLINE [
ACCESS, USERID, GROUP, REDUCTION_KEY, OMIT
ADMIN, DIR01, EXEC, *,
USER, MGR01, SALES, NORTH, SALARY
USER, MGR01, SALES, NORTH, COMMISSION_PCT
USER, MGR01, SALES, NORTH, MARGIN_AMOUNT
];
In this example, manager MGR01 has access to NORTH regional records, but the fields SALARY, COMMISSION_PCT, and MARGIN_AMOUNT are completely removed from their data model.
6. Server Architecture & Automated Reload Governance
In enterprise deployments, data architects must ensure automated reload tasks succeed while maintaining strict data governance.
The INTERNAL\SA_SCHEDULER Requirement
On client-managed Qlik Sense Enterprise on Windows, scheduled reload tasks are executed by the Qlik Engine Service running under the built-in system identity: INTERNAL\SA_SCHEDULER.
- When the scheduler triggers a task reload, it opens the application binary.
- If Section Access is present, the engine authenticates
INTERNAL\SA_SCHEDULERagainst the security table. - Critical Failure: If
INTERNAL\SA_SCHEDULERis omitted from Section Access, the reload task fails immediately with an "Access Denied" error, or the engine reloads an empty data model because the account was reduced to zero rows.
To ensure background reloads succeed, architects must always include INTERNAL\SA_SCHEDULER as an ADMIN with wildcard access:
Section Access;
LOAD * INLINE [
ACCESS, USERID, REDUCTION_KEY
ADMIN, INTERNAL\SA_SCHEDULER, *
];
If you do not want to use INTERNAL\SA_SCHEDULER, an administrator can enable impersonation in the QMC so reload tasks run with the app owner's permissions; in that case the app owner, not the scheduler account, needs the ADMIN row.
Qlik Cloud Section Access Considerations
In Qlik Cloud, authentication utilizes Identity Provider (IdP) subjects rather than Windows NT domain accounts:
USERIDis compared with the identity provider's subject claim (for exampleauth0|64a2f8...); alternatively useUSER.EMAIL.- To reload an app without data reduction, Qlik recommends
USER.EMAILrows withADMINaccess for the users who edit and reload it (for exampleADMIN, TEST@EXAMPLE.COM, *), or anADMINrow for a developerGROUP. INTERNAL\SA_SCHEDULERis a client-managed account; Section Access written for Qlik Sense Enterprise on Windows does not work unchanged in Qlik Cloud.
Preventing Developer Lockout
When authoring Section Access, a developer can inadvertently lock themselves out of the application if their own account is missing from the table or mistyped. Recovery means opening the app without data and editing the access section, which requires edit and reload rights to the app.
Caution
Developer Protection Protocol:
- Always include your own user identity as an
ADMINbefore running a reload. - Maintain an unreduced development copy of the application (without Section Access) in a secure development stream or space.
- Confirm in advance who holds edit and reload rights, so someone can open the app without data and repair the access section if needed.
7. Complete Production Script Implementation
The following complete script demonstrates an enterprise-grade Section Access implementation, incorporating user directories, group inheritance, wildcard permissions, column omission, and automated scheduler accounts:
///$tab Section_Access_Security
// ---------------------------------------------------------------------------
// ENTERPRISE DATA SECURITY GATEWAY
// ---------------------------------------------------------------------------
Section Access;
// Load Authorization Matrix from Secure Governance Directory
// Rows (comments must stay outside the INLINE brackets, or they load as data):
// 1. Scheduler account for QMC reload tasks 2. Lead data architect
// 3. Executive group: all listed regions 4-5. Regional directors
// 6-9. Junior analysts: one region each, SALARY and PROFIT_MARGIN omitted
LOAD
ACCESS,
USERID,
GROUP,
Upper(Trim(REDUCTION_KEY)) as REDUCTION_KEY,
Upper(Trim(OMIT)) as OMIT
INLINE [
ACCESS, USERID, GROUP, REDUCTION_KEY, OMIT
ADMIN, INTERNAL\SA_SCHEDULER, *, *,
ADMIN, CORP\QLIK_ADMIN, *, *,
USER, *, EXEC, *,
USER, CORP\DIR_NORTH, *, NORTH,
USER, CORP\DIR_SOUTH, *, SOUTH,
USER, CORP\ANALYST_N1, *, NORTH, SALARY
USER, CORP\ANALYST_N1, *, NORTH, PROFIT_MARGIN
USER, CORP\ANALYST_S1, *, SOUTH, SALARY
USER, CORP\ANALYST_S1, *, SOUTH, PROFIT_MARGIN
];
// ---------------------------------------------------------------------------
// BUSINESS APPLICATION DOMAIN
// ---------------------------------------------------------------------------
Section Application;
// Load Dimensional Attributes
Dim_Region:
LOAD
Upper(Trim(RegionCode)) as REDUCTION_KEY,
RegionName,
RegionalDirector
INLINE [
RegionCode, RegionName, RegionalDirector
NORTH, North Region, Sarah Connor
SOUTH, South Region, John Matrix
EAST, East Region, Ellen Ripley
WEST, West Region, James Braddock
];
// Load Fact Transactions with Matching Casing
Fact_Sales:
LOAD
TransactionID,
Upper(Trim(RegionCode)) as REDUCTION_KEY,
SalesAmount,
Salary as SALARY, // OMIT values are uppercase, so the field names must be too
ProfitMargin as PROFIT_MARGIN
FROM [lib://SecureData/Transactions.qvd] (qvd);
8. Common Exam Pitfalls & Traps
Warning
Pitfall 1: Assuming * Includes Unlisted Values or Nulls
An exam scenario will ask why a CEO with * cannot see transactions for a newly opened branch. The reason is that * only expands to values explicitly listed in the security table. If the new branch is not in Section Access, it is excluded.
Warning
Pitfall 2: Casing Mismatches on Reduction Keys
Writing NORTH in Section Access and leaving North in Section Application. Because comparison is binary ASCII, the match fails, resulting in access denial or empty data.
Warning
Pitfall 3: Omitting INTERNAL\SA_SCHEDULER in Windows Deployments
Forgetting to provision the service account. The app works perfectly when reloaded manually in the hub by the developer, but fails every night when scheduled in the QMC.
Warning
Pitfall 4: Creating Multiple Reduction Fields without Composite Keys
Listing several reduction columns (e.g., REGION and DEPARTMENT) in Section Access. Each reduction field adds another field-level filter, so access granted across several rows becomes harder to reason about and test. Many architects combine the attributes into a single composite reduction key (REGION & '_' & DEPARTMENT) built identically in both sections, so each row grants exactly one combination.
A multinational firm implements Section Access to restrict sales records by country. The Section Access table explicitly lists only three country codes: US, UK, and DE. The chief operating officer has an ACCESS level of USER with COUNTRY set to '*'. An ETL reload appends transactions from a newly acquired French subsidiary with COUNTRY set to 'FR' in Section Application. When the COO logs into the application, which records can they access?
The COO will see records for US, UK, DE, and FR because the asterisk wildcard bypasses all data reduction filters in Section Application.
The COO will receive an immediate 'Access Denied' error because FR exists in Section Application but is missing from Section Access.
The COO will see records for US, UK, and DE, but will NOT see records for FR, because the asterisk wildcard only expands to values explicitly declared in the Section Access reduction column.
The COO will see only records for FR, as Qlik Sense isolates newly loaded unmapped keys into an administrative review queue.
An enterprise Qlik Sense Data Architect deploys an application with Section Access to a client-managed Qlik Sense Enterprise on Windows environment. Manual reloads triggered by the architect in the Hub succeed without issue. However, every automated reload scheduled through a QMC task fails with an execution error. What is the root cause of this failure?
The Section Access table is missing an entry for the Qlik Sense Engine repository service account (INTERNAL\SA_REPOSITORY).
The Qlik Sense Management Console cannot trigger tasks on applications that contain Section Application statements.
The Section Access table does not contain an ADMIN entry for the Windows service identity INTERNAL\SA_SCHEDULER.
The data architect did not convert the reduction fields into numerical hash keys using Hash256().
A hospital network requires that medical billing analysts can review patient visit records, but the sensitive fields PatientDiagnosis and BillingBalance must be completely hidden from their view. Which Section Access configuration correctly enforces this column-level security requirement?
In Section Application, apply the HIDE FIELDS statement: HIDE FIELDS PatientDiagnosis, BillingBalance FROM GROUP 'BILLING_ANALYSTS';
In Section Access, define a single row for the billing group and specify OMIT = 'PATIENTDIAGNOSIS, BILLINGBALANCE' separated by a comma.
In Section Application, set the chart calculation condition to GetCurrentSelectedFields() <> 'PatientDiagnosis' across all sheets.
In Section Access, define two separate rows for the billing group with ACCESS = 'USER', specifying OMIT = 'PATIENTDIAGNOSIS' on the first row and OMIT = 'BILLINGBALANCE' on the second row, ensuring field names match Section Application in UPPERCASE.
Sections you finish are checked off in the contents.