Author, test, schedule, and parameterize the queries that feed reporting dashboards in Nobly Insight.
A data source is a named, saved query that returns the rows and columns a dashboard element displays. You author it once, and every element that needs that data points at it.
Creating and editing data sources requires the Manage Reporting Data Sources permission — held by whoever builds reporting, whether a customer administrator, super user, or consultant. With View Reporting Data Sources only, you can see existing data sources but not change them.
Materialized snapshot — the result set, captured into a snapshot table when the data source refreshes. Dashboards read from the snapshot, not from your live tables, so a heavy query runs only at refresh time and dashboards stay fast.
Reporting queries always run read-only, and only against the data an administrator has made available to reporting — never your own account’s wider access. This keeps reporting isolated from the rest of the system. Test query cost and refresh frequency with representative volumes; read-only access does not make an expensive query free of performance impact.
A data source with viewer-supplied runtime parameters runs live when the dashboard needs those values. Query parameters resolved by the platform alone do not prevent scheduled snapshots.
Open Settings → Admin → Reporting → Allowed sources. Viewing the list requires reporting.datasources.view or reporting.sources.manage; adding and removing approvals requires reporting.sources.manage (also covered by reporting.admin).
Review whether the table or view is already approved and what data it exposes.
Choose Add source, enter its schema and object name, and add a description of its intended reporting use.
Save. The object must exist and be readable by reporting. If the product reports missing access, ask the person responsible for the data source to make it available, then retry.
Test the dependent reporting query and confirm the returned columns before publishing a dashboard.
Approval controls which source objects reporting queries may read. It does not grant every viewer direct access to those objects.
Identify the dependent data sources and dashboards before removing an approval. Revocation also invalidates existing snapshots backed by that approval; it is not limited to preventing the next refresh. Those dashboards can lose their data until their sources are corrected and refreshed.If removal reports an active run or another conflict, let that operation finish and retry. Check the final approval list and affected dashboards to confirm the outcome.
The editor is split into two panes: you author the query on the left and set its configuration — refresh schedule and run limits — on the right.
1
Open the reporting administration area
Go to the reporting administration area and choose to add a new data source.
The data sources list in the reporting administration area.
2
Name and describe it
Give it a clear, descriptive name — this is what you pick from when adding an element. Add an optional description so other builders recognize what it returns.
3
Write the query
Enter a SELECT query that returns the columns you want to report on. Keep it to the columns you need: the column names become the field names available to every element. Common table expressions (WITH … SELECT) are supported for structuring more complex queries.
4
Test it
Click Test SQL. Nobly Insight validates the query, runs it read-only with a small preview cap, and shows you the resulting columns and a sample of rows — along with the objects the query referenced — so you can confirm the shape before saving.
The data source editor: author the query and Test SQL on the left; set the refresh schedule and run limits in the Configuration pane on the right.
5
Configure refresh
In the Configuration pane, set how the source refreshes — the schedule, an optional row cap, and, if needed, a blackout window (below). Leave Enabled on so the scheduler keeps it current.
6
Save
Save the data source. It is now selectable when designing dashboards. Until the first refresh, elements bound to it show an Awaiting first run freshness state — use Refresh now to materialize the snapshot immediately rather than waiting for the schedule.
A data source can declare runtime parameters — named values the viewer fills in when the dashboard opens. Reference each one in the SQL as @Name, matching the parameter’s name.A source with at least one viewer-supplied value parameter runs live with that input. A source whose parameters are all query-based can still refresh on its schedule and serve a snapshot. The presence of a parameter alone does not determine whether execution is live.Each parameter has:
Name — letters, digits, and underscores, starting with a letter. Used both as the label and as the @Name reference in SQL.
Type — Text, Number, Date, Yes/No, or one of the two lookups, Document type group and Document type. This decides how the viewer is prompted for the value.
Required — whether the viewer must supply a value before the dashboard loads.
Test values — sample values used only when you click Test SQL; they are not saved.
A Document type group or Document type parameter is picked from a list instead of typed: the viewer sees the groups and types they are allowed to view, by name, and the selected id binds to @Name as a number. Nobody has to know an internal id, and a value outside the viewer’s own access is refused when the dashboard loads.Two options apply to lookups only:
Allow several — the viewer can pick more than one. The picks bind as a JSON array of ids, which the SQL expands with OPENJSON. With a documents view an administrator has made available to reporting, holding one row per document and its document type id:
SELECT DocumentTypeId, COUNT(*) AS DocumentsFROM dbo.DocumentsWHERE DocumentTypeId IN (SELECT CAST(value AS bigint) FROM OPENJSON(@DocTypes))GROUP BY DocumentTypeId
Narrow by group parameter — on a document type parameter, names a document type group parameter of the same source. The viewer then only sees the types in the group they picked, and a type pick that no longer fits is cleared when the group changes. The group parameter itself does not have to appear in the SQL; it can exist purely to narrow the list.
An optional lookup left unpicked binds NULL, so a query can treat it as “all”: WHERE (@Group IS NULL OR DocumentTypeGroupId = @Group). The table and column names above are illustrative — the ids a lookup binds are the document type and document type group ids of Nobly Insight, and the view to match them against is whatever an administrator has made available to reporting.
A lookup parameter is viewer input, so the source runs live like any other value parameter — it cannot be scheduled as a snapshot. To let viewers narrow a scheduled source by group or type, use a dashboard filter on a column of the snapshot instead.
Check each parameter’s kind when deciding how the source refreshes. Use a viewer-supplied value when the result depends on the person’s input; use a query parameter when the platform should resolve the value. Test both execution and freshness after changing parameter kinds.
To keep reporting safe and predictable, queries are validated before they run:
Read-only
Only read queries are allowed. Statements that change data or schema are rejected at validation. A few read-only constructs are also blocked for safety — linked-server and cross-database access, OPENROWSET, EXEC, and query hints among them — so if validation rejects a query it considers unsafe, the message names the construct to remove.
Limited to the data reporting can read
Reporting can only read the data an administrator has made available to it. If your query references something reporting can’t read, the test fails with a message pointing at what’s missing — ask an administrator to make that data available to reporting, rather than changing your query.
Allowed tables
An administrator may pin reporting to a fixed set of source tables. When that allowlist is in place, a query that references any table not on it is rejected with a message naming the table (common table expressions are exempt). If you need a table that isn’t allowed yet, ask an administrator to add it to the allowlist — and to make sure reporting can read it.
Preview is capped
Test results are capped to a small preview so a large query stays responsive while you author it. This preview cap is separate from the data source’s row cap; the full result set is captured when the source refreshes.
A scheduled data source refreshes automatically on its schedule, and you can also refresh it on demand with Refresh now. Each refresh re-captures the snapshot under the row cap you set; if the query’s columns have changed since the last refresh, the snapshot table is rebuilt to match — the refresh still succeeds, and the element’s freshness then shows Schema drift detected.
Schedule — pick how often the source refreshes. Presets range from Every 15 minutes through Hourly and Every 4 hours to Daily (at 02:00 or 06:00 UTC) and Weekly (Monday 02:00 UTC). Set a Preferred time (UTC) as advisory metadata, and use the Enabled toggle to pause scheduled runs.
Row cap — the maximum rows captured per refresh, up to 10,000. Leave at zero to use the server default. If a source has more rows than the cap, dashboards read only the captured rows and elements show a notice that totals, charts, and exports may be incomplete — raise the cap for sources that need the full set.
Blackout window — scheduled runs skip when they would fall inside this window (for example, during a nightly maintenance window). Set both a start and an end, or neither. Manual refresh is not affected.
Freshness — every dashboard element shows the state of its source: Updated 2 hr ago after a successful run, Awaiting first run before the first snapshot, Stale when overdue, Schema drift detected, Last run failed, or Live for a source with viewer-supplied parameters that runs on demand.
Changing a scheduled data source’s query or row cap drops its current snapshot, so dashboards bound to it report the source as stale — with no data — until the next refresh. Click Refresh now after such an edit so its dashboards don’t sit empty.
Test the query before saving. After saving, the next scheduled run picks it up — or click Refresh now if you can’t wait.
Design reporting dashboards in Nobly Insight — sections, rows, elements, the column grid, and how to configure each element type.
Once a data source is saved and refreshed, you can surface it on a dashboard — see Building dashboards.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Nobly Insight","colors":{"primary":"#16A34A","light":"#07C983","dark":"#15803D"},"logo":{"light":"https://mintcdn.com/nobly/opTUcxR0CGbmN76E/logo/light.svg?fit=max\u0026auto=format\u0026n=opTUcxR0CGbmN76E\u0026q=85\u0026s=1ddd4e29149fab9f5b8041757a769e84","dark":"https://mintcdn.com/nobly/yPygoKkHjmxvyXCa/logo/dark.png?fit=max\u0026auto=format\u0026n=yPygoKkHjmxvyXCa\u0026q=85\u0026s=3b2c24f895554566c46ae849c3afe46d"},"favicon":"https://mintcdn.com/nobly/opTUcxR0CGbmN76E/favicon.svg?fit=max\u0026auto=format\u0026n=opTUcxR0CGbmN76E\u0026q=85\u0026s=81911d0d343ca779fe58216a6f2d8685","navbar":{"links":[{"href":"mailto:support@nobly.dk","label":"Support"},{"href":"https://noblyorg.atlassian.net/servicedesk/customer/portals","label":"Support portal"},{"href":"tel:+4570707470","label":"+45 70707470"}],"primary":{"type":"button","label":"Homepage","href":"https://nobly.eu"}},"footer":{"socials":{"linkedin":"https://dk.linkedin.com/company/nobly-as","website":"https://nobly.eu"}},"styling":{"latex":false},"navigation":{"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"nobly","hasAudioNarration":false,"actualSubdomain":"nobly","customDomains":["docs.insight.nobly.dk"],"gitSource":{"type":"github","owner":"noblydk","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ae26918d5e5d9f913bc76bf","collectionId":"637ff530-a3d7-44ad-a2b9-669dea959bdb","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ae26918d5e5d9f913bc76bf"},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae3a19c591294c1866c7aaa","clientVersion":"0.0.4021","searchFilterCounts":[{"language":"default","tag":"Documentation","count":114},{"language":"default","tag":"Document types \u0026 keywords","count":13},{"language":"default","tag":"How-tos","count":13},{"language":"default","tag":"Everyday work","count":13},{"language":"default","tag":"Workflows","count":12},{"language":"default","tag":"Caseflow","count":11},{"language":"default","tag":"ContentFlow","count":11},{"language":"default","tag":"Features","count":8},{"language":"default","tag":"Permissions \u0026 access","count":5},{"language":"default","tag":"Reporting","count":5}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":true,"enableContextualStarterQuestions":true,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"reporting/data-sources","slug":"/reporting/data-sources","pageMetadata":{"title":"Data sources","description":"Author, test, schedule, and parameterize the queries that feed reporting dashboards in Nobly Insight.","icon":"database","href":"/reporting/data-sources"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Author, test, schedule, and parameterize the queries that feed reporting dashboards in Nobly Insight.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,em:`em`,li:`li`,ol:`ol`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,ul:`ul`,..._provideComponents(),...props.components},{Accordion,AccordionGroup,Card,CodeBlock,Frame,Heading,Note,OptimizedImage,Step,Steps,Tip}=_components;if(!Accordion)_missingMdxReference(`Accordion`,true);if(!AccordionGroup)_missingMdxReference(`AccordionGroup`,true);if(!Card)_missingMdxReference(`Card`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Frame)_missingMdxReference(`Frame`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Tip)_missingMdxReference(`Tip`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`A `,_jsx(_components.strong,{children:`data source`}),` is a named, saved query that returns the rows and columns a dashboard element displays. You author it once, and every element that needs that data points at it.`]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`Creating and editing data sources requires the `,_jsx(_components.strong,{children:`Manage Reporting Data Sources`}),` permission — held by whoever builds reporting, whether a customer administrator, super user, or consultant. With `,_jsx(_components.strong,{children:`View Reporting Data Sources`}),` only, you can see existing data sources but not change them.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`how-a-data-source-works`,children:`How a data source works`}),`\n`,_jsx(_components.p,{children:`A data source has two states:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Definition`}),` — the query you author and save.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Materialized snapshot`}),` — the result set, captured into a snapshot table when the data source `,_jsx(_components.strong,{children:`refreshes`}),`. Dashboards read from the snapshot, not from your live tables, so a heavy query runs only at refresh time and dashboards stay fast.`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`Reporting queries always run `,_jsx(_components.strong,{children:`read-only`}),`, and only against the data an administrator has made available to reporting — never your own account’s wider access. This keeps reporting isolated from the rest of the system. Test query cost and refresh frequency with representative volumes; read-only access does not make an expensive query free of performance impact.`]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`A data source with viewer-supplied `,_jsx(_components.a,{href:`#runtime-parameters`,children:`runtime parameters`}),` runs live when the dashboard needs those values. Query parameters resolved by the platform alone do not prevent scheduled snapshots.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`approve-a-reporting-source`,children:`Approve a reporting source`}),`\n`,_jsxs(_components.p,{children:[`Open `,_jsx(_components.strong,{children:`Settings → Admin → Reporting → Allowed sources`}),`. Viewing the list requires `,_jsx(_components.code,{children:`reporting.datasources.view`}),` or `,_jsx(_components.code,{children:`reporting.sources.manage`}),`; adding and removing approvals requires `,_jsx(_components.code,{children:`reporting.sources.manage`}),` (also covered by `,_jsx(_components.code,{children:`reporting.admin`}),`).`]}),`\n`,_jsxs(_components.ol,{children:[`\n`,_jsx(_components.li,{children:`Review whether the table or view is already approved and what data it exposes.`}),`\n`,_jsxs(_components.li,{children:[`Choose `,_jsx(_components.strong,{children:`Add source`}),`, enter its schema and object name, and add a description of its intended reporting use.`]}),`\n`,_jsx(_components.li,{children:`Save. The object must exist and be readable by reporting. If the product reports missing access, ask the person responsible for the data source to make it available, then retry.`}),`\n`,_jsx(_components.li,{children:`Test the dependent reporting query and confirm the returned columns before publishing a dashboard.`}),`\n`]}),`\n`,_jsx(_components.p,{children:`Approval controls which source objects reporting queries may read. It does not grant every viewer direct access to those objects.`}),`\n`,_jsx(Heading,{level:`3`,id:`remove-approval-deliberately`,children:`Remove approval deliberately`}),`\n`,_jsx(_components.p,{children:`Identify the dependent data sources and dashboards before removing an approval. Revocation also invalidates existing snapshots backed by that approval; it is not limited to preventing the next refresh. Those dashboards can lose their data until their sources are corrected and refreshed.`}),`\n`,_jsx(_components.p,{children:`If removal reports an active run or another conflict, let that operation finish and retry. Check the final approval list and affected dashboards to confirm the outcome.`}),`\n`,_jsx(Heading,{level:`2`,id:`create-a-data-source`,children:`Create a data source`}),`\n`,_jsxs(_components.p,{children:[`The editor is split into two panes: you author the `,_jsx(_components.strong,{children:`query`}),` on the left and set its `,_jsx(_components.strong,{children:`configuration`}),` — refresh schedule and run limits — on the right.`]}),`\n`,_jsxs(Steps,{children:[_jsxs(Step,{title:`Open the reporting administration area`,children:[_jsx(_components.p,{children:`Go to the reporting administration area and choose to add a new data source.`}),_jsx(Frame,{caption:`The data sources list in the reporting administration area.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/nobly/I4hKUyNUJ7lzQHry/images/reporting/datasource-list.png?fit=max\u0026auto=format\u0026n=I4hKUyNUJ7lzQHry\u0026q=85\u0026s=8746d17e41a9e4fd11196370a9adbe9b`,alt:`The reporting administration data sources list, showing existing data sources with their freshness and a button to add a new one.`,\"data-og-width\":`1919`,width:`1919`,\"data-og-height\":`512`,height:`512`,\"data-path\":`images/reporting/datasource-list.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/nobly/I4hKUyNUJ7lzQHry/images/reporting/datasource-list.png?w=280\u0026fit=max\u0026auto=format\u0026n=I4hKUyNUJ7lzQHry\u0026q=85\u0026s=56e2766c5b067d8a415810b68e1cbd52 280w, https://mintcdn.com/nobly/I4hKUyNUJ7lzQHry/images/reporting/datasource-list.png?w=560\u0026fit=max\u0026auto=format\u0026n=I4hKUyNUJ7lzQHry\u0026q=85\u0026s=511294981be0d08c14e0094b89b18a2d 560w, https://mintcdn.com/nobly/I4hKUyNUJ7lzQHry/images/reporting/datasource-list.png?w=840\u0026fit=max\u0026auto=format\u0026n=I4hKUyNUJ7lzQHry\u0026q=85\u0026s=c8766a28494a22a47ad67d65196eee81 840w, https://mintcdn.com/nobly/I4hKUyNUJ7lzQHry/images/reporting/datasource-list.png?w=1100\u0026fit=max\u0026auto=format\u0026n=I4hKUyNUJ7lzQHry\u0026q=85\u0026s=16e856f867dd6f207e5da640c9ca39b0 1100w, https://mintcdn.com/nobly/I4hKUyNUJ7lzQHry/images/reporting/datasource-list.png?w=1650\u0026fit=max\u0026auto=format\u0026n=I4hKUyNUJ7lzQHry\u0026q=85\u0026s=c025047a51b78c15aeee85bc164cfd01 1650w, https://mintcdn.com/nobly/I4hKUyNUJ7lzQHry/images/reporting/datasource-list.png?w=2500\u0026fit=max\u0026auto=format\u0026n=I4hKUyNUJ7lzQHry\u0026q=85\u0026s=633227c4137fab3e2b8aff5ffe156892 2500w`})})]}),_jsx(Step,{title:`Name and describe it`,children:_jsxs(_components.p,{children:[`Give it a clear, descriptive `,_jsx(_components.strong,{children:`name`}),` — this is what you pick from when adding an element. Add an optional `,_jsx(_components.strong,{children:`description`}),` so other builders recognize what it returns.`]})}),_jsx(Step,{title:`Write the query`,children:_jsxs(_components.p,{children:[`Enter a `,_jsx(_components.code,{children:`SELECT`}),` query that returns the columns you want to report on. Keep it to the columns you need: the column names become the field names available to every element. Common table expressions (`,_jsx(_components.code,{children:`WITH … SELECT`}),`) are supported for structuring more complex queries.`]})}),_jsxs(Step,{title:`Test it`,children:[_jsxs(_components.p,{children:[`Click `,_jsx(_components.strong,{children:`Test SQL`}),`. Nobly Insight validates the query, runs it read-only with a small preview cap, and shows you the resulting columns and a sample of rows — along with the objects the query referenced — so you can confirm the shape before saving.`]}),_jsx(Frame,{caption:`The data source editor: author the query and Test SQL on the left; set the refresh schedule and run limits in the Configuration pane on the right.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/nobly/I4hKUyNUJ7lzQHry/images/reporting/datasource-editor.png?fit=max\u0026auto=format\u0026n=I4hKUyNUJ7lzQHry\u0026q=85\u0026s=35c35d14e0b1f070b26f8fb85509c281`,alt:`The two-pane data source editor, showing the name and description, the SQL editor with Test SQL, and the Configuration pane with the Enabled toggle, refresh schedule, preferred time, row cap, and blackout window.`,\"data-og-width\":`1919`,width:`1919`,\"data-og-height\":`1036`,height:`1036`,\"data-path\":`images/reporting/datasource-editor.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/nobly/I4hKUyNUJ7lzQHry/images/reporting/datasource-editor.png?w=280\u0026fit=max\u0026auto=format\u0026n=I4hKUyNUJ7lzQHry\u0026q=85\u0026s=683ca09cf1581adcf9aa25a03f7ddd16 280w, https://mintcdn.com/nobly/I4hKUyNUJ7lzQHry/images/reporting/datasource-editor.png?w=560\u0026fit=max\u0026auto=format\u0026n=I4hKUyNUJ7lzQHry\u0026q=85\u0026s=cb3008a5255534fe8a33bdb80f12fdc4 560w, https://mintcdn.com/nobly/I4hKUyNUJ7lzQHry/images/reporting/datasource-editor.png?w=840\u0026fit=max\u0026auto=format\u0026n=I4hKUyNUJ7lzQHry\u0026q=85\u0026s=2dfcdc06b07d00c82323ad846d2da723 840w, https://mintcdn.com/nobly/I4hKUyNUJ7lzQHry/images/reporting/datasource-editor.png?w=1100\u0026fit=max\u0026auto=format\u0026n=I4hKUyNUJ7lzQHry\u0026q=85\u0026s=c8c65418cd75e135cf14e94c7793e7be 1100w, https://mintcdn.com/nobly/I4hKUyNUJ7lzQHry/images/reporting/datasource-editor.png?w=1650\u0026fit=max\u0026auto=format\u0026n=I4hKUyNUJ7lzQHry\u0026q=85\u0026s=6dfd4d537dc3d01277f1d2bbf433adf7 1650w, https://mintcdn.com/nobly/I4hKUyNUJ7lzQHry/images/reporting/datasource-editor.png?w=2500\u0026fit=max\u0026auto=format\u0026n=I4hKUyNUJ7lzQHry\u0026q=85\u0026s=920c7ce54a1695ff36023d49b92d52eb 2500w`})})]}),_jsx(Step,{title:`Configure refresh`,children:_jsxs(_components.p,{children:[`In the `,_jsx(_components.strong,{children:`Configuration`}),` pane, set how the source refreshes — the `,_jsx(_components.strong,{children:`schedule`}),`, an optional `,_jsx(_components.strong,{children:`row cap`}),`, and, if needed, a `,_jsx(_components.strong,{children:`blackout window`}),` (below). Leave `,_jsx(_components.strong,{children:`Enabled`}),` on so the scheduler keeps it current.`]})}),_jsx(Step,{title:`Save`,children:_jsxs(_components.p,{children:[`Save the data source. It is now selectable when designing dashboards. Until the first refresh, elements bound to it show an `,_jsx(_components.em,{children:`Awaiting first run`}),` freshness state — use `,_jsx(_components.strong,{children:`Refresh now`}),` to materialize the snapshot immediately rather than waiting for the schedule.`]})})]}),`\n`,_jsx(Heading,{level:`2`,id:`runtime-parameters`,children:`Runtime parameters`}),`\n`,_jsxs(_components.p,{children:[`A data source can declare `,_jsx(_components.strong,{children:`runtime parameters`}),` — named values the viewer fills in when the dashboard opens. Reference each one in the SQL as `,_jsx(_components.code,{children:`@Name`}),`, matching the parameter’s name.`]}),`\n`,_jsx(_components.p,{children:`A source with at least one viewer-supplied value parameter runs live with that input. A source whose parameters are all query-based can still refresh on its schedule and serve a snapshot. The presence of a parameter alone does not determine whether execution is live.`}),`\n`,_jsx(_components.p,{children:`Each parameter has:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Name`}),` — letters, digits, and underscores, starting with a letter. Used both as the label and as the `,_jsx(_components.code,{children:`@Name`}),` reference in SQL.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Type`}),` — `,_jsx(_components.strong,{children:`Text`}),`, `,_jsx(_components.strong,{children:`Number`}),`, `,_jsx(_components.strong,{children:`Date`}),`, `,_jsx(_components.strong,{children:`Yes/No`}),`, or one of the two lookups, `,_jsx(_components.strong,{children:`Document type group`}),` and `,_jsx(_components.strong,{children:`Document type`}),`. This decides how the viewer is prompted for the value.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Required`}),` — whether the viewer must supply a value before the dashboard loads.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Test values`}),` — sample values used only when you click `,_jsx(_components.strong,{children:`Test SQL`}),`; they are not saved.`]}),`\n`]}),`\n`,_jsx(Heading,{level:`3`,id:`lookup-parameters`,children:`Lookup parameters`}),`\n`,_jsxs(_components.p,{children:[`A `,_jsx(_components.strong,{children:`Document type group`}),` or `,_jsx(_components.strong,{children:`Document type`}),` parameter is picked from a list instead of typed: the viewer sees the groups and types they are allowed to view, by name, and the selected id binds to `,_jsx(_components.code,{children:`@Name`}),` as a number. Nobody has to know an internal id, and a value outside the viewer’s own access is refused when the dashboard loads.`]}),`\n`,_jsx(_components.p,{children:`Two options apply to lookups only:`}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Allow several`}),` — the viewer can pick more than one. The picks bind as a JSON array of ids, which the SQL expands with `,_jsx(_components.code,{children:`OPENJSON`}),`. With a documents view an administrator has made available to reporting, holding one row per document and its document type id:`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`4`,language:`sql`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`sql`,children:_jsxs(_components.code,{language:`sql`,numberOfLines:`4`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`SELECT`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` DocumentTypeId, `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`COUNT`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`*`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`AS`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` Documents`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`FROM`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:` dbo`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#D4D4D4`},children:`Documents`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`WHERE`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` DocumentTypeId `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`IN`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` (`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`SELECT`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:` CAST`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`value`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` AS`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` bigint`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`FROM`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:` OPENJSON`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(@DocTypes))`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`GROUP BY`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` DocumentTypeId`})]}),`\n`]})})}),`\n`]}),`\n`,_jsxs(_components.li,{children:[`\n`,_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Narrow by group parameter`}),` — on a document type parameter, names a document type group parameter of the same source. The viewer then only sees the types in the group they picked, and a type pick that no longer fits is cleared when the group changes. The group parameter itself does not have to appear in the SQL; it can exist purely to narrow the list.`]}),`\n`]}),`\n`]}),`\n`,_jsxs(_components.p,{children:[`An optional lookup left unpicked binds `,_jsx(_components.code,{children:`NULL`}),`, so a query can treat it as “all”: `,_jsx(_components.code,{children:`WHERE (@Group IS NULL OR DocumentTypeGroupId = @Group)`}),`. The table and column names above are illustrative — the ids a lookup binds are the document type and document type group ids of Nobly Insight, and the view to match them against is whatever an administrator has made available to reporting.`]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`A lookup parameter is viewer input, so the source runs live like any other value parameter — it cannot be scheduled as a snapshot. To let viewers narrow a `,_jsx(_components.em,{children:`scheduled`}),` source by group or type, use a `,_jsx(_components.a,{href:`/reporting/building-dashboards#add-dashboard-filters`,children:`dashboard filter`}),` on a column of the snapshot instead.`]})}),`\n`,_jsx(Note,{children:_jsx(_components.p,{children:`Check each parameter’s kind when deciding how the source refreshes. Use a viewer-supplied value when the result depends on the person’s input; use a query parameter when the platform should resolve the value. Test both execution and freshness after changing parameter kinds.`})}),`\n`,_jsx(Heading,{level:`2`,id:`query-rules`,children:`Query rules`}),`\n`,_jsx(_components.p,{children:`To keep reporting safe and predictable, queries are validated before they run:`}),`\n`,_jsxs(AccordionGroup,{children:[_jsx(Accordion,{title:`Read-only`,id:`read-only`,children:_jsxs(_components.p,{children:[`Only read queries are allowed. Statements that change data or schema are rejected at validation. A few read-only constructs are also blocked for safety — linked-server and cross-database access, `,_jsx(_components.code,{children:`OPENROWSET`}),`, `,_jsx(_components.code,{children:`EXEC`}),`, and query hints among them — so if validation rejects a query it considers unsafe, the message names the construct to remove.`]})}),_jsx(Accordion,{title:`Limited to the data reporting can read`,id:`limited-to-the-data-reporting-can-read`,children:_jsx(_components.p,{children:`Reporting can only read the data an administrator has made available to it. If your query references something reporting can’t read, the test fails with a message pointing at what’s missing — ask an administrator to make that data available to reporting, rather than changing your query.`})}),_jsx(Accordion,{title:`Allowed tables`,id:`allowed-tables`,children:_jsx(_components.p,{children:`An administrator may pin reporting to a fixed set of source tables. When that allowlist is in place, a query that references any table not on it is rejected with a message naming the table (common table expressions are exempt). If you need a table that isn’t allowed yet, ask an administrator to add it to the allowlist — and to make sure reporting can read it.`})}),_jsx(Accordion,{title:`Preview is capped`,id:`preview-is-capped`,children:_jsx(_components.p,{children:`Test results are capped to a small preview so a large query stays responsive while you author it. This preview cap is separate from the data source’s row cap; the full result set is captured when the source refreshes.`})})]}),`\n`,_jsx(Heading,{level:`2`,id:`refresh-and-freshness`,children:`Refresh and freshness`}),`\n`,_jsxs(_components.p,{children:[`A scheduled data source refreshes automatically on its `,_jsx(_components.strong,{children:`schedule`}),`, and you can also refresh it on demand with `,_jsx(_components.strong,{children:`Refresh now`}),`. Each refresh re-captures the snapshot under the row cap you set; if the query’s columns have changed since the last refresh, the snapshot table is rebuilt to match — the refresh still succeeds, and the element’s freshness then shows `,_jsx(_components.em,{children:`Schema drift detected`}),`.`]}),`\n`,_jsxs(_components.ul,{children:[`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Schedule`}),` — pick how often the source refreshes. Presets range from `,_jsx(_components.strong,{children:`Every 15 minutes`}),` through `,_jsx(_components.strong,{children:`Hourly`}),` and `,_jsx(_components.strong,{children:`Every 4 hours`}),` to `,_jsx(_components.strong,{children:`Daily`}),` (at 02:00 or 06:00 UTC) and `,_jsx(_components.strong,{children:`Weekly`}),` (Monday 02:00 UTC). Set a `,_jsx(_components.strong,{children:`Preferred time (UTC)`}),` as advisory metadata, and use the `,_jsx(_components.strong,{children:`Enabled`}),` toggle to pause scheduled runs.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Row cap`}),` — the maximum rows captured per refresh, up to 10,000. Leave at zero to use the server default. If a source has more rows than the cap, dashboards read only the captured rows and elements show a notice that totals, charts, and exports may be incomplete — raise the cap for sources that need the full set.`]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Blackout window`}),` — scheduled runs skip when they would fall inside this window (for example, during a nightly maintenance window). Set both a start and an end, or neither. `,_jsx(_components.strong,{children:`Manual refresh is not affected.`})]}),`\n`,_jsxs(_components.li,{children:[_jsx(_components.strong,{children:`Freshness`}),` — every dashboard element shows the state of its source: `,_jsx(_components.em,{children:`Updated 2 hr ago`}),` after a successful run, `,_jsx(_components.em,{children:`Awaiting first run`}),` before the first snapshot, `,_jsx(_components.em,{children:`Stale`}),` when overdue, `,_jsx(_components.em,{children:`Schema drift detected`}),`, `,_jsx(_components.em,{children:`Last run failed`}),`, or `,_jsx(_components.strong,{children:`Live`}),` for a source with viewer-supplied parameters that runs on demand.`]}),`\n`]}),`\n`,_jsx(Note,{children:_jsxs(_components.p,{children:[`Changing a scheduled data source’s `,_jsx(_components.strong,{children:`query or row cap`}),` drops its current snapshot, so dashboards bound to it report the source as `,_jsx(_components.em,{children:`stale`}),` — with no data — until the next refresh. Click `,_jsx(_components.strong,{children:`Refresh now`}),` after such an edit so its dashboards don’t sit empty.`]})}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`Test the query before saving. After saving, the next scheduled run picks it up — or click `,_jsx(_components.strong,{children:`Refresh now`}),` if you can’t wait.`]})}),`\n`,_jsx(Heading,{level:`2`,id:`where-to-read-next`,children:`Where to read next`}),`\n`,_jsx(Card,{title:`Building dashboards`,icon:`pen-ruler`,href:`/reporting/building-dashboards`,horizontal:true,children:_jsx(_components.p,{children:`Design reporting dashboards in Nobly Insight — sections, rows, elements, the column grid, and how to configure each element type.`})}),`\n`,_jsxs(_components.p,{children:[`Once a data source is saved and refreshed, you can surface it on a dashboard — see `,_jsx(_components.a,{href:`/reporting/building-dashboards`,children:`Building dashboards`}),`.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Data sources","description":"Author, test, schedule, and parameterize the queries that feed reporting dashboards in Nobly Insight.","icon":"database","href":"/reporting/data-sources"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"How a data source works","slug":"how-a-data-source-works","depth":2,"children":[]},{"title":"Approve a reporting source","slug":"approve-a-reporting-source","depth":2,"children":[{"title":"Remove approval deliberately","slug":"remove-approval-deliberately","depth":3,"children":[]}]},{"title":"Create a data source","slug":"create-a-data-source","depth":2,"children":[]},{"title":"Runtime parameters","slug":"runtime-parameters","depth":2,"children":[{"title":"Lookup parameters","slug":"lookup-parameters","depth":3,"children":[]}]},{"title":"Query rules","slug":"query-rules","depth":2,"children":[]},{"title":"Refresh and freshness","slug":"refresh-and-freshness","depth":2,"children":[]},{"title":"Where to read next","slug":"where-to-read-next","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"nobly","siteName":"Nobly Insight","title":"Data sources - Nobly Insight","contextualStarterQuestions":[{"_id":"6abf7d85afdb1b13eafc5f60","deploymentId":"69a56586576c3f2247043b21","questionText":"When do snapshots refresh?","status":"active","generatedBy":"contextual","path":"reporting/data-sources","createdAt":"2026-10-02T09:46:45.099Z","updatedAt":"2026-10-02T09:46:45.099Z","__v":0},{"_id":"6abf7d85afdb1b13eafc5f5e","deploymentId":"69a56586576c3f2247043b21","questionText":"What is a data source?","status":"active","generatedBy":"contextual","path":"reporting/data-sources","createdAt":"2026-10-02T09:46:45.099Z","updatedAt":"2026-10-02T09:46:45.099Z","__v":0},{"_id":"6abf7d85afdb1b13eafc5f5f","deploymentId":"69a56586576c3f2247043b21","questionText":"How do I approve a reporting source?","status":"active","generatedBy":"contextual","path":"reporting/data-sources","createdAt":"2026-10-02T09:46:45.099Z","updatedAt":"2026-10-02T09:46:45.099Z","__v":0}],"navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-10-02T09:46:30.490Z","originalFileLocation":"reporting/data-sources.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Author, test, schedule, and parameterize the queries that feed reporting dashboards in Nobly Insight.\">\u003cmeta data-mint-head name=\"application-name\" content=\"Nobly Insight\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/nobly/JuhuiPozCqqEW1kZ/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/nobly/JuhuiPozCqqEW1kZ/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/nobly/JuhuiPozCqqEW1kZ/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/nobly/JuhuiPozCqqEW1kZ/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/nobly/JuhuiPozCqqEW1kZ/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/nobly/JuhuiPozCqqEW1kZ/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/nobly/JuhuiPozCqqEW1kZ/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/nobly/JuhuiPozCqqEW1kZ/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/nobly/JuhuiPozCqqEW1kZ/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Data sources - Nobly Insight\">\u003cmeta data-mint-head property=\"og:description\" content=\"Author, test, schedule, and parameterize the queries that feed reporting dashboards in Nobly Insight.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Nobly Insight\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.insight.nobly.dk/reporting/data-sources\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://nobly.mintlify.app/_mintlify/api/og/v2?division=Reporting\u0026amp;title=Data+sources\u0026amp;description=Author%2C+test%2C+schedule%2C+and+parameterize+the+queries+that+feed+reporting+dashboards+in+Nobly+Insight.\u0026amp;theme=d705a151b66bed9b8a595520\u0026amp;signature=6dc258e00c6652154febfbc055095c4b97ad07611abb0443427e5e13e3ad79ff\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Data sources - Nobly Insight\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Author, test, schedule, and parameterize the queries that feed reporting dashboards in Nobly Insight.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://nobly.mintlify.app/_mintlify/api/og/v2?division=Reporting\u0026amp;title=Data+sources\u0026amp;description=Author%2C+test%2C+schedule%2C+and+parameterize+the+queries+that+feed+reporting+dashboards+in+Nobly+Insight.\u0026amp;theme=d705a151b66bed9b8a595520\u0026amp;signature=6dc258e00c6652154febfbc055095c4b97ad07611abb0443427e5e13e3ad79ff\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/nobly/JuhuiPozCqqEW1kZ/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Nobly Insight\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#16A34A\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.insight.nobly.dk/reporting/data-sources\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/reporting/data-sources.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.insight.nobly.dk/#organization\",\"name\":\"Nobly Insight\",\"url\":\"https://docs.insight.nobly.dk\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/nobly/opTUcxR0CGbmN76E/logo/light.svg?fit=max\u0026auto=format\u0026n=opTUcxR0CGbmN76E\u0026q=85\u0026s=1ddd4e29149fab9f5b8041757a769e84\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.insight.nobly.dk#website\",\"name\":\"Nobly Insight\",\"url\":\"https://docs.insight.nobly.dk\",\"publisher\":{\"@id\":\"https://docs.insight.nobly.dk/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.insight.nobly.dk/reporting/data-sources#webpage\",\"url\":\"https://docs.insight.nobly.dk/reporting/data-sources\",\"name\":\"Data sources\",\"description\":\"Author, test, schedule, and parameterize the queries that feed reporting dashboards in Nobly Insight.\",\"dateModified\":\"2026-10-02T09:46:30.490Z\",\"isPartOf\":{\"@id\":\"https://docs.insight.nobly.dk#website\"},\"breadcrumb\":{\"@id\":\"https://docs.insight.nobly.dk/reporting/data-sources#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.insight.nobly.dk/reporting/data-sources#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Reporting\",\"item\":\"https://docs.insight.nobly.dk/reporting/introduction\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Data sources\",\"item\":\"https://docs.insight.nobly.dk/reporting/data-sources\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.insight.nobly.dk/reporting/data-sources#article\",\"headline\":\"Data sources\",\"name\":\"Data sources\",\"description\":\"Author, test, schedule, and parameterize the queries that feed reporting dashboards in Nobly Insight.\",\"url\":\"https://docs.insight.nobly.dk/reporting/data-sources\",\"mainEntityOfPage\":{\"@id\":\"https://docs.insight.nobly.dk/reporting/data-sources#webpage\"},\"dateModified\":\"2026-10-02T09:46:30.490Z\",\"publisher\":{\"@id\":\"https://docs.insight.nobly.dk/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.insight.nobly.dk#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Nobly Insight\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Nobly Insight","nav":{"global":null,"tabs":[{"tab":"Documentation","groups":[{"group":"Getting started","pages":[{"title":"What is Nobly Insight?","icon":"house","href":""},{"title":"How the system fits together","icon":"diagram-project","href":"/system-overview"}]},{"group":"Features","pages":[{"title":"Features overview","icon":"list-check","href":"/features/introduction"},{"title":"Document management","icon":"folder-open","href":"/features/document-management"},{"title":"Smart search","icon":"magnifying-glass","href":"/features/search"},{"title":"Case management \u0026 workflow","icon":"table-columns","href":"/features/case-management"},{"title":"Notes \u0026 collaboration","icon":"comments","href":"/features/notes-and-collaboration"},{"title":"Retention \u0026 deletion","icon":"shield-check","href":"/features/retention"},{"title":"Extensibility","icon":"code","href":"/features/extensibility"},{"title":"Administration \u0026 governance","icon":"gear","href":"/features/administration"}]},{"group":"How we use AI","pages":[{"title":"How we use AI","icon":"shield-check","href":"/ai/introduction"},{"title":"Data and privacy","icon":"lock","href":"/ai/data-and-privacy"},{"title":"Infrastructure and models","icon":"microchip","href":"/ai/infrastructure"}]},{"group":"Permissions \u0026 access","pages":[{"title":"Introduction","icon":"shield-halved","href":"/permissions/introduction"},{"title":"Application permissions","icon":"key","href":"/permissions/application-permissions"},{"title":"Managing permissions","icon":"users-gear","href":"/permissions/managing-permissions"},{"title":"Users and user groups","icon":"shield-halved","href":"/permissions/users-and-groups"},{"title":"Single sign-on \u0026 federation","icon":"right-to-bracket","href":"/permissions/single-sign-on"}]},{"group":"Document types \u0026 keywords","pages":[{"title":"Introduction","icon":"sitemap","href":"/configuration/introduction"},{"title":"Document types","icon":"folder-tree","href":"/configuration/document-types"},{"title":"Keyword types","icon":"tags","href":"/configuration/keyword-types"},{"title":"Keyword assignment models","icon":"layer-group","href":"/configuration/keyword-assignment-models"},{"title":"Autofill keyword sets","icon":"wand-magic-sparkles","href":"/configuration/autofill-keyword-sets"},{"title":"Autofill on edit","icon":"arrows-rotate","href":"/configuration/autofill-on-edit"},{"title":"Cascading datasets","icon":"network-wired","href":"/configuration/cascading-datasets"},{"title":"Keyword behaviour on a document type","icon":"sliders","href":"/configuration/keyword-behaviour"},{"title":"Calculated keywords","icon":"calculator","href":"/configuration/calculated-keywords"},{"title":"Document access rights","icon":"user-lock","href":"/configuration/document-access-rights"},{"title":"Security keyword rules","icon":"sliders","href":"/configuration/security-keywords"},{"title":"Mass value editing","icon":"sliders","href":"/configuration/mass-value-editing"},{"title":"External dataset lookups","icon":"sliders","href":"/configuration/external-datasets"}]},{"group":"Client administration","pages":[{"title":"Client defaults and document actions","icon":"gear","href":"/client-administration/defaults-and-actions"},{"title":"Notices, navigation, and maintenance","icon":"gear","href":"/client-administration/notices-and-maintenance"}]},{"group":"Search administration","pages":[{"title":"System searches","icon":"magnifying-glass","href":"/search-administration/system-searches"},{"title":"Search history and auditing","icon":"clock-rotate-left","href":"/search-administration/history-and-auditing"},{"title":"Dynamic folder views","icon":"magnifying-glass","href":"/search-administration/folder-views"}]},{"group":"AI search","pages":[{"title":"AI Search introduction","icon":"magnifying-glass","href":"/ai-search/introduction"},{"title":"LLM reranker and query rewrite","icon":"sparkles","href":"/ai-search/llm-reranker-and-rewrite"},{"title":"AI search index administration","icon":"magnifying-glass","href":"/ai-search/index-administration"}]},{"group":"AI document classification","pages":[{"title":"AI document classification","icon":"wand-magic-sparkles","href":"/document-classification/introduction"},{"title":"How the classification tree runs","icon":"sitemap","href":"/document-classification/how-it-runs"},{"title":"Configuring the classification tree","icon":"sliders","href":"/document-classification/configuring-the-tree"}]},{"group":"AI administration","pages":[{"title":"Structured extraction profiles","icon":"sliders","href":"/ai-administration/extraction-profiles"},{"title":"AI agents and shared settings","icon":"sliders","href":"/ai-administration/agents-and-settings"},{"title":"Admin assistant","icon":"sparkles","href":"/ai-administration/admin-assistant"},{"title":"Approving changes","icon":"circle-check","href":"/ai-administration/approvals"}]},{"group":"Caseflow","pages":[{"title":"Introduction to Caseflow","icon":"table-columns","href":"/caseflow/introduction"},{"title":"Applications, classes, and attributes","icon":"table-columns","href":"/caseflow/applications-and-classes"},{"title":"Build your first Caseflow template","icon":"pen-ruler","href":"/caseflow/first-template"},{"title":"Templates and syntax","icon":"code","href":"/caseflow/templates"},{"title":"Portal templates","icon":"window-restore","href":"/caseflow/portal-templates"},{"title":"State, persistence, and caching","icon":"database","href":"/caseflow/state-and-persistence"},{"title":"Actions and scripting","icon":"bolt","href":"/caseflow/actions-and-scripting"},{"title":"Form components","icon":"input-text","href":"/caseflow/form-components"},{"title":"Data and action components","icon":"table-list","href":"/caseflow/data-components"},{"title":"Lists, saved searches, and search operators","icon":"magnifying-glass","href":"/caseflow/lists-and-search"},{"title":"Administration and best practices","icon":"gear","href":"/caseflow/administration"}]},{"group":"Form documents","pages":[{"title":"Form documents","icon":"file-pen","href":"/forms/introduction"},{"title":"Form templates","icon":"pen-ruler","href":"/forms/templates"},{"title":"Form components","icon":"input-text","href":"/forms/components"},{"title":"Administration","icon":"gear","href":"/forms/administration"}]},{"group":"Script Engine","pages":[{"title":"Script Engine","icon":"code","href":"/scripts/introduction"},{"title":"Authoring and publishing scripts","icon":"code","href":"/scripts/authoring-and-publishing"},{"title":"Script examples you can adapt","icon":"flask","href":"/scripts/examples"},{"title":"Bindings and event hooks","icon":"code","href":"/scripts/bindings-and-events"},{"title":"Variables, secrets and troubleshooting","icon":"code","href":"/scripts/secrets-and-troubleshooting"}]},{"group":"Workflows","pages":[{"title":"Introduction to Workflows","icon":"diagram-project","href":"/workflows/introduction"},{"title":"Configure a contract review workflow","icon":"route","href":"/workflows/first-workflow"},{"title":"Building workflows in the designer","icon":"pen-ruler","href":"/workflows/designer"},{"title":"Action reference","icon":"bolt","href":"/workflows/actions"},{"title":"References \u0026 expressions","icon":"code","href":"/workflows/expressions"},{"title":"Task access and validation","icon":"list-check","href":"/workflows/tasks"},{"title":"Schedules and batch workflows","icon":"diagram-project","href":"/workflows/schedules-and-batches"},{"title":"Monitoring \u0026 administration","icon":"chart-line","href":"/workflows/monitoring"},{"title":"Interaction rules","icon":"circle-question","href":"/workflows/interaction-rules"},{"title":"Ask before creating a case object","icon":"route","href":"/workflows/interaction-rules-example"},{"title":"Confirm, run a background script, show the result","icon":"route","href":"/workflows/document-action-example"},{"title":"Workflow trigger or script hook","icon":"code-branch","href":"/workflows/choosing-automation"}]},{"group":"ContentFlow","pages":[{"title":"ContentFlow","icon":"arrows-spin","href":"/contentflow/introduction"},{"title":"Access and permissions","icon":"shield-halved","href":"/contentflow/access"},{"title":"Incoming items","icon":"inbox","href":"/contentflow/incoming-items"},{"title":"Document mappings","icon":"arrows-left-right","href":"/contentflow/document-mappings"},{"title":"Try, check and publish a mapping","icon":"flask","href":"/contentflow/testing-and-publishing-mappings"},{"title":"Building workflows","icon":"diagram-project","href":"/contentflow/design-and-publishing"},{"title":"Step reference","icon":"list","href":"/contentflow/steps"},{"title":"Testing workflows","icon":"vial","href":"/contentflow/testing-workflows"},{"title":"Variables and tools","icon":"sliders","href":"/contentflow/variables-and-tools"},{"title":"States and recovery","icon":"list-check","href":"/contentflow/states-and-recovery"},{"title":"Authoring with an AI assistant","icon":"robot","href":"/contentflow/ai-assistant"}]},{"group":"Integrations","pages":[{"title":"API clients and service accounts","icon":"plug","href":"/integrations/api-clients"},{"title":"Integration contracts","icon":"plug","href":"/integrations/contracts"},{"title":"Pending uploads queue","icon":"inbox","href":"/integrations/pending-uploads"}]},{"group":"Mailbox importer","pages":[{"title":"Configure a Microsoft 365 mailbox","icon":"envelope","href":"/mailbox-importer/setup"},{"title":"Archive rules and keyword mappings","icon":"envelopes-bulk","href":"/mailbox-importer/archive-rules"},{"title":"Route imported mail into workflows","icon":"route","href":"/mailbox-importer/workflows"},{"title":"Operate and troubleshoot mail imports","icon":"list-check","href":"/mailbox-importer/operations"}]},{"group":"AI assistant access","pages":[{"title":"Introduction to AI assistant access","icon":"robot","href":"/mcp/introduction"},{"title":"Granting access","icon":"key","href":"/mcp/granting-access"},{"title":"Connecting an assistant","icon":"plug","href":"/mcp/connecting-an-assistant"}]},{"group":"Reporting","pages":[{"title":"Introduction to Reporting","icon":"chart-line","href":"/reporting/introduction"},{"title":"Setup \u0026 requirements","description":"What an administrator turns on to make reporting available on a tenant: enabling the feature, granting the reporting permissions, and switching on scheduled refresh.","icon":"sliders","href":"/reporting/setup"},{"title":"Data sources","icon":"database","href":"/reporting/data-sources"},{"title":"Building dashboards","description":"Design reporting dashboards in Nobly Insight — sections, rows, elements, the column grid, and how to configure each element type.","icon":"pen-ruler","href":"/reporting/building-dashboards"},{"title":"Viewing dashboards","icon":"chart-mixed","href":"/reporting/viewing-dashboards"}]},{"group":"Retention \u0026 deletion","pages":[{"title":"Introduction","icon":"shield-check","href":"/retention/introduction"},{"title":"Policies \u0026 simulation","icon":"scroll","href":"/retention/policies"},{"title":"Approvals, holds \u0026 quarantine","icon":"gavel","href":"/retention/approvals-holds-quarantine"},{"title":"Scheduling \u0026 access","icon":"clock","href":"/retention/scheduling-and-access"},{"title":"Setup \u0026 troubleshooting","icon":"list-check","href":"/retention/setup"}]},{"group":"Configuration promotion","pages":[{"title":"Configuration promotion","icon":"right-left","href":"/configuration-promotion/introduction"},{"title":"Promote configuration","icon":"file-export","href":"/configuration-promotion/promoting-configuration"},{"title":"Group mappings and kept differences","icon":"users-gear","href":"/configuration-promotion/rules-and-differences"},{"title":"History and environment status","icon":"clock-rotate-left","href":"/configuration-promotion/history-and-status"}]},{"group":"Release notes","pages":[{"title":"Release notes","icon":"sparkles","href":"/release-notes/changelog"}]}]},{"tab":"How-tos","icon":"list-check","pages":[{"title":"How-tos","href":"/how-tos/introduction"}]}]},"title":"Data sources - Nobly Insight","buildId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","deploymentId":"dpl_EnxDqhjaNc9a8MVa833TGULPd9uJ","dynamics":["07c022d89b","a74be98ba7"],"chunks":["Frame-CIbhtp2j.js","DynamicMarkdown-CtpgKJwj.js","zoom-image-lightbox-CVZVK4hN.js","lightbox-handle-r17bVUz3.js"]}