Sensitive Data Masking
Once you mark information that must not be exposed—national ID numbers, phone numbers, account numbers—any teammate who connects with a masked role sees it hidden, replaced on the server. Two kinds are provided: column masking, which hides an entire column, and pattern masking, which hides only the parts of a value that match a regular expression. The real value is never sent to the client, so it can't be recovered even by inspecting the browser.
How it works
Sensitive data masking is role-based. When you set a role as a "masking target" in the project, designated sensitive data is hidden on the server before it reaches teammates connecting with that role. The owner (OWNER) and full-permission roles always see the original values.
Both of the following settings are required:
- ① Masked roles — which roles have values hidden from them (set in project settings)
- ② What to hide — designate which columns to hide (column masking), or register which patterns to hide (pattern masking)
Values are hidden on the server. Masked roles never receive the original value, so there's no way to reveal it.
Sensitive data masking is available only in online team projects. It does not apply in offline (personal) mode.
There are two kinds of masking. Column masking hides an entire designated column (steps 1–2), while pattern masking hides only the parts of a value that match a regular expression (see below). When you set a role as a masking target, both apply together.
Step 1 · Configure masked roles

Under Role Permissions in project settings, turn on "Sensitive Data Masking" for a role to make it a masking target. At least one role must have masking enabled before you can designate columns.
| Role | Can be masked | Description |
|---|---|---|
| Owner (OWNER) | No (always original) | The project owner always sees full values and is excluded from masking. |
| Full-permission role | No (always original) | A role granted full permissions is never masked. |
| Manager · DBA · Member | Yes | With masking on, a role sees designated sensitive columns as ****. |
Role hierarchy and automatic inheritance
Masking follows a trust hierarchy, ordered Manager > DBA > Member. Masking a higher role automatically masks the lower roles too, on the principle that a lower role must never see more than a higher one. (e.g. masking Manager also masks DBA and Member.)
Once you save the masking settings, they take effect immediately in any ERD, table editor, or result view that's already open—no need to reopen the project.
Step 2 · Mark sensitive columns

Right-click the column you want to hide and choose "Mark as sensitive" or "Unmark sensitive" from the context menu. Marked columns show a lock (shield) icon. Designations are saved to the server instantly and shared with every project member.
You can designate columns in these places.
- ERD table node — right-click a column on a table in the canvas
- Table editor — right-click in the column list
- Object detail (view) column list — view columns can be designated the same way
Designate / unmark permissions (asymmetric)
| Action | Who can do it | Reason |
|---|---|---|
| Designate (add) | Owner, or a role that is not a masking target | Because it hides values rather than exposing them, it's allowed fairly broadly. Masking-target roles, however, cannot designate columns. |
| Unmark (remove) | Owner only | Unmarking exposes the value to masking targets. Only the owner may decide to reverse that exposure. |

Only text-type columns can be designated. In tables and ERDs, only text types such as VARCHAR and TEXT are eligible. Numeric types like DECIMAL and INT, as well as date and boolean types, are not, so "Mark as sensitive" doesn't appear in the right-click menu for them. Sensitive data—national ID numbers, phone numbers, emails, and the like—is mostly text, and the restriction keeps masked values consistent to edit as plain text.
PK · FK columns cannot be designated. Primary and foreign keys are the basis for editing and joins, so if an already-designated column later becomes a PK/FK, its sensitive designation is removed automatically.
Pattern masking
Where column masking hides a whole designated column, pattern masking scans the content of a value with a regular expression and hides only the matching parts. That means a phone number or ID that appears mid-sentence inside a free-text column such as a memo or note can be masked in place. It complements column masking by catching sensitive data scattered inside text.

Registering a pattern
In project settings → Role Permissions, turn on "Sensitive Data Masking" and the Pattern masking item appears. Click Manage Patterns to add one. In the dialog, enter a name · regular expression · masking mode, and type sample text into the preview to see exactly how it will be masked in real time. Registered patterns are shared across the whole project.

Masking modes
| Mode | What it does | Example |
|---|---|---|
| Partial | Keeps a few leading/trailing characters and hides the rest. | 010-1234-5678 → 010-****-**** |
| Full | Hides the entire match. | 900101-1234567 → ******-******* |
| Template | Keeps only certain parts (e.g. the domain) and rebuilds the value (mark parts to keep with $1·$2). | hong@example.com → ***@example.com |
Common patterns (mobile phone, national ID, credit card, email) can be filled in with one click using the Quick start buttons in the dialog.
Its scope and editing behavior are the same as column masking. Values are hidden on the server and carried into SQL results, AI results, and exports; editing a column where a pattern actually matched starts with an empty value.
Applies to text values only. Because it works on content, without surrounding context it may hide unintended values (such as numbers that look like amounts). Check with the preview before saving, and narrow the scope by including nearby words in the regex (e.g. "salary") if needed.
Where masking applies

For masking-target roles, sensitive column values come through as **** across all of the paths below.
- SQL editor result grid
- AI query results — the AI model also receives only
****, never the original. - Result export — files exported as CSV, Excel, etc. also store the masked value.
- Preview panel
Editing a masked cell

A masked cell does not show the original, so opening the editor starts with an empty value. Saving without entering anything leaves the value unchanged; entering a new value runs an UPDATE with it. In other words, the old value is never revealed even while editing. Note that a masked column used as a primary key (PK) cannot be edited.
What gets masked
Not only the value of a sensitive column queried directly, but also results derived from it (a substring, a concatenation with another value, etc.) are hidden as much as possible. When in doubt, it errs toward preventing exposure.
Notes & limits
- Works only in online team projects; it does not apply in offline (personal) mode.
- The owner and full-permission roles are never masked under any circumstances.
- If no role is a masking target, column designation is disabled.
- PK · FK columns are automatically excluded from designation.
- Only the owner can unmark a designation.
- Pattern masking hides parts of text values based on their content, and applies together with column masking whenever a role is a masking target.
