Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
f921fe5
Revert "Revert "v8.5.6 dashboard: Add note about prepared statements …
hfxsd Apr 2, 2026
1389d74
Revert "Revert "v8.5.6: system-variables: add doc for `tidb_max_dist_…
hfxsd Apr 2, 2026
152f158
Revert "Revert "[v8.5.6] docs: update sync-diff-inspector docs for mo…
hfxsd Apr 2, 2026
18a288d
resource_control: background control feature GA (#21506) (#21509)
ti-chi-bot Apr 3, 2026
3cb7a06
sql: add note about table aliases in FOR UPDATE OF clause (#21489) (#…
ti-chi-bot Apr 3, 2026
1e91cbd
sys-var: clarify `tidb_slow_log_rules` syntax/behavior and de-duplica…
ti-chi-bot Apr 8, 2026
e0ee3f0
Merge branch 'release-8.5' into feature/preview-v8.5.6
qiancai Apr 8, 2026
09898e8
Merge branch 'feature/preview-v8.5.6' of https://github.com/pingcap/d…
qiancai Apr 8, 2026
b856f00
v8.5.6 ticdc: add scheduler configuration recommendations for table s…
ti-chi-bot Apr 8, 2026
dc01dc5
tidb: add the join order related variable `tidb_opt_join_reorder_thro…
ti-chi-bot Apr 9, 2026
d9c59ef
v8.5.6: DM supports MySQL 8.4 (#21421) (#21498)
ti-chi-bot Apr 9, 2026
c56f525
Merge branch 'release-8.5' into feature/preview-v8.5.6
hfxsd Apr 10, 2026
8c62341
tikv: add configuration items about mvcc load based compaction (#2151…
ti-chi-bot Apr 10, 2026
add90b9
system-variable: the value of ‘tidb_service_scope’ becomes case-insen…
ti-chi-bot Apr 10, 2026
c0297fd
docs: document column-level privileges (v8.5) (#21437)
fzzf678 Apr 10, 2026
5a1d2eb
statistics: deprecate stats v1 in 8.5 docs (#21476)
qiancai Apr 11, 2026
a1f1e2f
v8.5.6: ticdc: add header line for CSV protocol (#20478) (#21165)
ti-chi-bot Apr 13, 2026
19b2cfb
planner: update the default value of tidb_ignore_inlist_plan_digest t…
ti-chi-bot Apr 13, 2026
a027332
v8.5.6: Add two internal session variable info (#21400) (#21541)
ti-chi-bot Apr 13, 2026
79d485a
v8.5: bump up the latest version to v8.5.6 (#21536)
hfxsd Apr 13, 2026
a758907
v8.5.6: document `tidb_foreign_key_check_in_shared_lock` (#21359) (#2…
ti-chi-bot Apr 13, 2026
962aa70
v8.5.6: refresh TopSQL docs and screenshots (#21431) (#21538)
ti-chi-bot Apr 13, 2026
c0c436e
v8.5.6: Add new session variable "tidb_opt_partial_ordered_index_for_…
ti-chi-bot Apr 13, 2026
b61456d
v8.5.6: dm experimentally supports foreign key (#21523) (#21542)
ti-chi-bot Apr 14, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions TOC.md
Original file line number Diff line number Diff line change
Expand Up @@ -633,6 +633,7 @@
- 权限
- [与 MySQL 安全特性差异](/security-compatibility-with-mysql.md)
- [权限管理](/privilege-management.md)
- [列级权限管理](/column-privilege-management.md)
- [TiDB 用户账户管理](/user-account-management.md)
- [TiDB 密码管理](/password-management.md)
- [基于角色的访问控制](/role-based-access-control.md)
Expand Down
2 changes: 1 addition & 1 deletion basic-features.md
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,7 @@ summary: 了解 TiDB 的功能概览。
| [Green GC](/system-variables.md#tidb_gc_scan_lock_mode-从-v50-版本开始引入) | E | E | E | E | E | E | E |
| [资源管控 (Resource Control)](/tidb-resource-control-ru-groups.md) | Y | Y | Y | Y | N | N | N |
| [Runaway Queries 自动管理](/tidb-resource-control-runaway-queries.md) | Y | Y | E | N | N | N | N |
| [后台任务资源管控](/tidb-resource-control-background-tasks.md) | E | E | E | N | N | N | N |
| [后台任务资源管控](/tidb-resource-control-background-tasks.md) | Y | E | E | N | N | N | N |
| [TiFlash 存算分离架构与 S3 支持](/tiflash/tiflash-disaggregated-and-s3.md) | Y | Y | Y | E | N | N | N |
| [选择执行分布式执行框架任务的 TiDB 节点](/system-variables.md#tidb_service_scope-从-v740-版本开始引入) | Y | Y | Y | N | N | N | N |
| 通过系统变量 [`tidb_enable_tso_follower_proxy`](/system-variables.md#tidb_enable_tso_follower_proxy-从-v530-版本开始引入) 控制 PD Follower Proxy 功能 | Y | Y | Y | Y | Y | Y | Y |
Expand Down
172 changes: 172 additions & 0 deletions column-privilege-management.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,172 @@
---
title: 列级权限管理
summary: TiDB 支持兼容 MySQL 的列级权限管理机制。你可以通过 `GRANT` 或 `REVOKE` 在指定表上对指定列授予或回收 `SELECT`、`INSERT`、`UPDATE`、`REFERENCES` 权限,实现更细粒度的访问控制。
---

# 列级权限管理

从 v8.5.6 版本开始,TiDB 支持兼容 MySQL 的列级权限管理机制。通过列级权限,你可以在指定表上对指定列授予或回收 `SELECT`、`INSERT`、`UPDATE`、`REFERENCES` 权限,从而实现更细粒度的数据访问控制。

> **注意:**
>
> 虽然 MySQL 语法允许 `REFERENCES(col_name)` 这种列级写法,但 `REFERENCES` 本身属于数据库/表级权限,用于外键相关的权限检查。因此,列级 `REFERENCES` 在 MySQL 中不会带来实际的列级权限效果。TiDB 的行为与 MySQL 保持一致。

## 语法

列级权限的授予和回收语法与表级权限类似,区别如下:

- 列名列表写在**权限类型**后面,而不是写在**表名**后面。
- 多个列名之间使用逗号(`,`)分隔。

```sql
GRANT priv_type(col_name [, col_name] ...) [, priv_type(col_name [, col_name] ...)] ...
ON db_name.tbl_name
TO 'user'@'host';

REVOKE priv_type(col_name [, col_name] ...) [, priv_type(col_name [, col_name] ...)] ...
ON db_name.tbl_name
FROM 'user'@'host';
```

其中:

* `priv_type` 支持 `SELECT`、`INSERT`、`UPDATE` 和 `REFERENCES`。
* `ON` 后必须指定具体表,例如 `test.tbl`。
* 同一条 `GRANT` 或 `REVOKE` 语句可以包含多个权限项,每个权限项都可以指定自己的列名列表。

例如,以下语句表示将 `col1`、`col2` 的 `SELECT` 权限和 `col3` 的 `UPDATE` 权限授予用户:

```sql
GRANT SELECT(col1, col2), UPDATE(col3) ON test.tbl TO 'user'@'host';
```

## 授予列级权限示例

以下示例将表 `test.tbl` 中 `col1` 和 `col2` 的 `SELECT` 权限授予用户 `newuser`,并将 `col3` 的 `UPDATE` 权限授予该用户:

```sql
CREATE DATABASE IF NOT EXISTS test;
USE test;

DROP TABLE IF EXISTS tbl;
CREATE TABLE tbl (col1 INT, col2 INT, col3 INT);

DROP USER IF EXISTS 'newuser'@'%';
CREATE USER 'newuser'@'%';

GRANT SELECT(col1, col2), UPDATE(col3) ON test.tbl TO 'newuser'@'%';
SHOW GRANTS FOR 'newuser'@'%';
```

```
+---------------------------------------------------------------------+
| Grants for newuser@% |
+---------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'newuser'@'%' |
| GRANT SELECT(col1, col2), UPDATE(col3) ON test.tbl TO 'newuser'@'%' |
+---------------------------------------------------------------------+
```

除了使用 `SHOW GRANTS`,你还可以通过查询 `INFORMATION_SCHEMA.COLUMN_PRIVILEGES` 查看列级权限信息。

## 回收列级权限示例

以下示例从用户 `newuser` 收回列 `col2` 的 `SELECT` 权限:

```sql
REVOKE SELECT(col2) ON test.tbl FROM 'newuser'@'%';
SHOW GRANTS FOR 'newuser'@'%';
```

```
+---------------------------------------------------------------+
| Grants for newuser@% |
+---------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'newuser'@'%' |
| GRANT SELECT(col1), UPDATE(col3) ON test.tbl TO 'newuser'@'%' |
+---------------------------------------------------------------+
```

## 列级权限访问控制示例

在授予或回收列级权限后,TiDB 会对 SQL 中引用的列进行权限检查。例如:

* `SELECT` 语句:`SELECT` 列权限会影响 `SELECT` 列表以及 `WHERE`、`ORDER BY` 等子句中引用的列。
* `UPDATE` 语句:`SET` 子句中被更新的列需要 `UPDATE` 列权限。在表达式、条件中被读取的列通常还需要 `SELECT` 列权限。
* `INSERT` 语句:被写入的列需要 `INSERT` 列权限。`INSERT INTO t VALUES (...)` 等价于按表定义顺序向所有列写入值。

以下示例中,用户 `newuser` 仅能查询 `col1`,并更新 `col3`:

```sql
-- 以 newuser 登录执行
SELECT col1 FROM tbl;
SELECT * FROM tbl; -- 报错(缺少 col2、col3 的 SELECT 列权限)

UPDATE tbl SET col3 = 1;
UPDATE tbl SET col1 = 2; -- 报错(缺少 col1 的 UPDATE 列权限)

UPDATE tbl SET col3 = col1;
UPDATE tbl SET col3 = col3 + 1; -- 报错(缺少 col3 的 SELECT 列权限)
UPDATE tbl SET col3 = col1 WHERE col1 > 0;
```

## 与 MySQL 的兼容性差异

TiDB 的列级权限整体与 MySQL 兼容,但在以下场景存在差异:

| 场景 | TiDB | MySQL |
| :----------------------- | :-------------------------- | :---------------------------- |
| 收回用户未被授予的列级权限 | `REVOKE` 可以成功执行 | 在未使用 `IF EXISTS` 时,`REVOKE` 会报错 |
| 列裁剪与 `SELECT` 列权限检查的执行顺序 | 先检查 `SELECT` 列权限,再进行列裁剪。例如,执行 `SELECT a FROM (SELECT a, b FROM t) s` 需要同时拥有 `t.a` 和 `t.b` 的 `SELECT` 列权限。 | 先进行列裁剪,再检查 `SELECT` 列权限。例如,执行 `SELECT a FROM (SELECT a, b FROM t) s` 只需要 `t.a` 的 `SELECT` 列权限。 |

### 视图场景的列裁剪与权限检查

在对视图进行 `SELECT` 权限检查时,MySQL 和 TiDB 存在以下差异:

- MySQL 会先对视图内部查询做列裁剪,再检查内部表的列权限,因此在某些场景下检查相对宽松。
- TiDB 不会在权限检查之前做列裁剪,因此可能需要额外的列权限。

```sql
-- 以 root 登录准备环境
DROP USER IF EXISTS 'u'@'%';
CREATE USER 'u'@'%';

DROP TABLE IF EXISTS t;
CREATE TABLE t (a INT, b INT, c INT, d INT);

DROP VIEW IF EXISTS v;
CREATE SQL SECURITY INVOKER VIEW v AS SELECT a, b FROM t WHERE c = 0 ORDER BY d;

GRANT SELECT ON v TO 'u'@'%';

-- 以 u 登录
SELECT a FROM v;
-- MySQL:报错,缺少对 t.a、t.c、t.d 的访问权限
-- TiDB:报错,缺少对 t.a、t.b、t.c、t.d 的访问权限

-- 以 root 登录
GRANT SELECT(a, c, d) ON t TO 'u'@'%';

-- 以 u 登录
SELECT a FROM v;
-- MySQL:成功(会将内部查询裁剪为 `SELECT a FROM t WHERE c = 0 ORDER BY d`)
-- TiDB:报错,缺少对 t.b 的访问权限

SELECT * FROM v;
-- MySQL:报错,缺少对 t.b 的访问权限
-- TiDB:报错,缺少对 t.b 的访问权限

-- 以 root 登录
GRANT SELECT(b) ON t TO 'u'@'%';

-- 以 u 登录
SELECT * FROM v;
-- MySQL:成功
-- TiDB:成功
```

## 另请参阅

* [权限管理](/privilege-management.md)
* [`GRANT <privileges>`](/sql-statements/sql-statement-grant-privileges.md)
* [`REVOKE <privileges>`](/sql-statements/sql-statement-revoke-privileges.md)
3 changes: 2 additions & 1 deletion dashboard/dashboard-slow-query.md
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,8 @@ summary: 了解如何在 TiDB Dashboard 中查看慢查询。

>**注意:**
>
> 记录在 `Query` 中的查询的长度会受到 [`tidb_stmt_summary_max_sql_length`](/system-variables.md#tidb_stmt_summary_max_sql_length-从-v40-版本开始引入) 系统变量的限制。
> - 记录在 `Query` 中的查询的长度会受到 [`tidb_stmt_summary_max_sql_length`](/system-variables.md#tidb_stmt_summary_max_sql_length-从-v40-版本开始引入) 系统变量的限制。
> - 对于预处理语句,参数会在查询末尾列出,例如:`[arguments: "foo", 123]`。不可打印的参数会以十六进制字面量显示,例如 `0x01`。

点击**展开** (**Expand**) 可以展开相应项的完整内容,点击**复制** (**Copy**) 可以复制内容到剪贴板。

Expand Down
Loading
Loading