Lesson 10 of 16 · Level 3: Advanced
Publishing and Sharing in the Power BI Service with Row-Level Security
- ⏱ 13 min read
- ❓ 4 review questions
- ✍️ Exercise with solution
In this lesson
- Publish a report to the Power BI service and organize it in workspaces.
- Schedule automatic data refresh and know when you need a gateway.
- Share with dashboards, apps, Teams, subscriptions and alerts.
- Apply row-level security so each person sees only their own data.
- Set up dynamic security with Summit's SalesReps table and test it.
A report that lives on your laptop only helps you. The Power BI service (app.powerbi.com) is where reports get published, refresh on their own and are shared securely. In this lesson you'll go from a .pbix file to a solution the whole company uses.
Limits from Microsoft's Power BI service description, checked in November 2026. Microsoft can change them: check the current version before sizing a project.
Licensing: what you need to know
Building reports in Power BI Desktop is free. To share in the service, both the publisher and the viewers usually need a paid license (Pro or Premium Per User), unless the content lives in a dedicated company capacity (a Premium capacity or a Fabric F64 or larger capacity), in which case viewers can use free licenses. Many organizations already include Power BI Pro in their Microsoft 365 plans. Terms and prices change, so check Microsoft's official Power BI pricing page or ask IT before you decide.
Publishing
- In Power BI Desktop, sign in with your work or school account.
- Click Home › Publish and choose the destination workspace.
- Two items get published: the report (pages and visuals) and the semantic model (data, relationships and measures; it used to be called a "dataset").
When you make changes, publish to the same workspace again and confirm you want to replace it.
Workspaces and roles
A workspace is a shared folder for a team or project ("Sales", "Finance"). "My workspace" is personal: don't use it for content other people need. In each workspace you assign roles:
- Can
- Everything, including managing permissions and deleting the workspace.
- Permission level
- ●●●●
- Can
- Publish, edit and share content, and add people with lower roles.
- Permission level
- ●●●●
- Can
- Publish and edit content, but not share it or manage permissions.
- Permission level
- ●●●●
- Can
- Only view and interact with content.
- Permission level
- ●●●●
Best practice: creators work in the workspace and end users consume content through an app (see below), not by browsing the workspace.
Scheduled refresh
In the service, open the semantic model's settings › Scheduled refresh and choose the frequency and times. The number of refreshes per day depends on the license:
For a sales report like Summit's, one early refresh a day (say, 6:30 a.m.) is usually enough, and Pro's 8 per day leave plenty of room. If someone asks for "real-time data", read Lesson 14 before promising anything.
| Where the data lives | What you need |
|---|---|
| In the cloud: SharePoint, OneDrive for work or school, cloud databases, online services | Data source credentials in the semantic model settings |
| On the company network or your computer: files in a local folder, an internal SQL Server | An on-premises data gateway installed on a machine that's always on |
If your source is an Excel file someone updates by hand, save it in the company's SharePoint or OneDrive and connect to it there (not to a copy on your hard drive). The service can then refresh it without a gateway.
1. Your report reads a file from a folder on your laptop and you want it to refresh every morning. What do you need?
The service runs in the cloud and can't see your hard drive. Either move the file to the cloud or install a gateway.
The full path, from Desktop to your users
- Power BI DesktopPublishTo a team workspace, never to "My workspace" if others need it.
- Service · semantic model settingsCredentials and gatewayCredentials for each source; if there are local files or servers, map the gateway.
- Service · semantic model settingsScheduled refreshTimes, time zone and an email notification if it fails.
- Service · model securityAssign rolesPeople or groups for each row-level security role.
- WorkspaceCreate or update the appEnd users consume content from the app, with its navigation.
Ways to share
| Option | What it's for |
|---|---|
| App | Packages several reports from a workspace with navigation and publishes them to an audience (the whole sales team). The recommended way to reach end users. |
| Share a report | One-off access for specific people. |
| Dashboard | One screen of visuals pinned from one or more reports, ideal for monitoring indicators at a glance. |
| Teams and SharePoint | Embed the report as a tab in a Teams channel or on a SharePoint page. |
| Subscriptions | Email an image or file of the report on a schedule (for example, every Monday at 8:00 a.m.). |
| Alerts | On dashboards, get notified when a card, KPI or gauge crosses a threshold. |
| Export | To PowerPoint (as images or as a live report), PDF or Excel (a visual's data, depending on permissions). |
That option creates a public link anyone on the internet can open without signing in. It's only for open data. Many organizations disable it for security.
Row-level security (RLS)
With row-level security, one report shows each person only their own data: the Midwest manager sees the Midwest; the VP sees everything.
Static roles
- In Power BI Desktop: Modeling › Manage roles › New. Create a role named "Midwest".
- Select the Customers table and write the DAX filter:
[Region] = "Midwest". Thanks to the relationships, the filter reaches Sales. - Test it with Modeling › View as › Midwest.
- Publish and, in the service, open the semantic model's Security settings and add people or groups to the role.
Dynamic roles
With many managers, instead of one role per region, create an "Access" table with each person's email and region, relate it to your model and use a single role with this filter on the Access table:
[Email] = USERPRINCIPALNAME ()
USERPRINCIPALNAME returns the sign-in email of whoever is viewing the report. When a manager changes, you only update the table.
2. You want 15 store managers to each see only their store in the same report. What's easiest to maintain?
With dynamic security, staff changes are handled by updating a table, without touching the report.
Dynamic security with Summit's data
In the course file you don't need to build an access table: the SalesReps table already has each rep's email (for example, emily.carter@summitsupply.example). Create a "Sales Rep" role with this filter on SalesReps:
[Email] = USERPRINCIPALNAME ()
The filter flows from SalesReps to Sales through RepID (and to Targets, if you related it to SalesReps). Test it in Desktop with Modeling › View as, checking the role and typing Emily's email under Other user: every number should drop to hers. For 2025–2026 her sales are $133,438.18, exactly the Midwest region's total, because at Summit each rep covers a single region. Also create a "Leadership" role with no filter for people who should see everything.
RLS applies to people with the Viewer role in the workspace or who consume content through the app. Admins, Members and Contributors see all the data. That's why end users should never get editing roles.
3. Emily Carter opens Summit's app and is in the "Sales Rep" role with the filter [Email] = USERPRINCIPALNAME(). What 2025–2026 sales total does she see?
The filter keeps only her email's row in SalesReps, and the relationship carries that filter to Sales. If Emily were a Member of the workspace, though, she'd see everything: row-level security only applies to viewers.
Governance best practices
- One semantic model, many reports: several reports can connect to the same published model (Get data › Power BI semantic models). Measures are defined once and everyone uses the same "Sales" number.
- Separate workspaces for development and production when the report is critical.
- Check refresh history and set up failure notifications by email.
- Document measures with descriptions (in each measure's Properties pane).
- Sensitivity labels, if your organization uses them, for reports with sensitive data.
4. Five analysts build sales reports and each one calculates "Net Sales" differently. What's the best fix?
A shared semantic model guarantees a single version of the truth for every report.
Common publishing and sharing mistakes
Publishing to "My workspace" and sharing from there.
A team workspace and an app for end users.
Connecting the report to an Excel file on your desktop.
The file in company SharePoint or OneDrive, or a gateway on an always-on machine.
Giving the whole sales team the Member role "so they don't have problems".
Viewer or app access, so row-level security applies.
Testing security by publishing and asking "do you see your data?".
Test first with View as in Desktop and in the service, using each profile's email.
"Publish to web" to send the report to a client.
Share with their account or export a PDF; the public web is only for open data.
Practice exercise: publish your report
- If you have a work or school account with Power BI access, publish your report to a workspace.
- Set up scheduled refresh (move your Excel file to OneDrive or SharePoint if needed).
- Create a security role by region and test it with "View as".
- Pin three cards to a dashboard and set up an alert.
- If you don't have an account, do at least step 3 in Power BI Desktop, which requires no license.
See solution
For step 3, a static "Midwest" role with [Region] = "Midwest" on Customers should show $133,438.18 in "View as". For a dynamic version, here's a sample access table:
Access table:
Email | Region
emily.carter@summitsupply.example | Midwest
marcus.johnson@summitsupply.example | South
rachel.kim@summitsupply.example | Northeast
daniel.ortiz@summitsupply.example | West
Relationship: Access[Region] (1) → Customers[Region] (*). If one person
can cover several regions, Access will have several rows per email,
and it's better to relate it through a separate Regions table.
"By email" role, filter on the Access table:
[Email] = USERPRINCIPALNAME ()
For the VP who must see everything, create another role with no
filter (or leave them out of any filtered role).
Summary
- Publishing uploads the report and its semantic model to a workspace in the service.
- Sharing usually requires paid licenses or a company capacity; check current terms.
- Scheduled refresh needs credentials for cloud sources or a gateway for on-premises sources.
- Share through apps, Teams, subscriptions and alerts; never publish internal data to the web.
- Row-level security, especially dynamic RLS, shows each person only what they should see.
- RLS only applies to viewers: end users consume from the app, without editing roles.
Next lesson: Advanced DAX and Performance: Variables, Rankings, Top N and New Customers. You'll level up your DAX with variables, rankings, Top N, customer segments and performance tuning.
Create your account in 30 seconds, mark your lessons and download your certificate at the end.