叩町

叩町

【Dolt】Dolt存储过程

2025-08-22
【Dolt】Dolt存储过程

​DOLT_ADD()​

将当前会话中的工作区更改添加到暂存区。功能与CLI中的dolt add​完全相同,并接受相同的参数。

将表添加到暂存区后,可以使用DOLT_COMMIT()​提交这些更改。

CALL DOLT_ADD('-A');
CALL DOLT_ADD('.');
CALL DOLT_ADD('table1', 'table2');

选项

​table​:要添加到暂存区的表。可以使用缩写.​来添加所有表。

​-A​:暂存所有有更改的表。

输出模式

+--------+------+---------------------------+
| Field  | Type | Description               |
+--------+------+---------------------------+
| status | int  | 成功返回0,失败返回1      |
+--------+------+---------------------------+

示例

-- 设置当前会话的数据库
USE mydb;

-- 进行修改
UPDATE table
SET column = "new value"
WHERE pk = "key";

-- 暂存所有更改
CALL DOLT_ADD('-A');

-- 提交更改
CALL DOLT_COMMIT('-m', 'committing all changes');

​DOLT_BACKUP()​

添加或移除已配置的备份,与已配置的备份同步,将备份同步到远程URL,将远程URL备份恢复为一个新数据库。

输出模式

+--------+------+---------------------------+
| 字段   | 类型 | 描述                      |
+--------+------+---------------------------+
| status | int  | 成功为0,失败为1          |
+--------+------+---------------------------+

将当前数据库同步到已配置的备份:

CALL DOLT_BACKUP('sync', 'name');

与未配置为备份的远程URL同步:

CALL DOLT_BACKUP('sync-url', 'https://dolthub.com/some_organization/some_dolthub_repository');

添加和移除已配置的备份:

CALL DOLT_BACKUP('add', 'dolthub', 'https://dolthub.com/some_organization/some_dolthub_repository');

CALL DOLT_BACKUP('remove', 'dolthub');

恢复备份:

CALL DOLT_BACKUP('restore', 'https://dolthub.com/some_organization/some_dolthub_repository', 'database_name');

示例

-- 为会话设置当前数据库
USE mydb;

-- 配置一个备份以进行同步
CALL dolt_backup('add', 'my-backup', 'https://dolthub.com/some_organization/some_dolthub_repository');

-- 将当前数据库内容上传到命名备份
CALL dolt_backup('sync', 'my-backup')

-- 将上传的数据库恢复为一个新的数据库名称
CALL dolt_backup('restore', 'https://dolthub.com/some_organization/some_dolthub_repository', 'mydb_restored');

​DOLT_BRANCH()​

创建、删除和重命名分支。

要列出分支,请使用DOLT_BRANCHES系统表,而不是DOLT_BRANCH()​存储过程。

要查看当前分支,请使用@@<dbname>\_head\_ref系统变量,或使用active_branch()​ SQL函数,如下方示例部分所示。

警告:在多会话服务器环境中,如果某个分支正在其他会话中使用,Dolt将阻止您删除或重命名该分支。您可以通过传递--force​选项强制重命名或删除,但需要注意的是,其他会话中正在使用该分支的客户端将无法再执行语句,并需要结束会话后重新连接。

-- 从当前HEAD创建一个新分支
CALL DOLT_BRANCH('myNewBranch');

-- 从feature1分支的起点创建一个新分支
CALL DOLT_BRANCH('myNewBranch', 'feature1');

-- 通过复制现有分支创建一个新分支
-- 如果feature1分支已存在,将会失败
CALL DOLT_BRANCH('-c', 'main', 'feature1');

-- 通过复制现有分支创建或替换分支
-- '-f'选项强制复制,即使feature1分支已存在
CALL DOLT_BRANCH('-c', '-f', 'main', 'feature1');

-- 删除分支
CALL DOLT_BRANCH('-d', 'branchToDelete');

-- 重命名分支
CALL DOLT_BRANCH('-m', 'currentBranchName', 'newBranchName')

注意事项

分支名称有一些限制,与Git对分支名称的约束类似。Dolt的分支名称限制更严格,要求必须使用ASCII字符。规则如下:

  • 所有字符必须是ASCII(7位)

  • 不得以'.'(句点)开头

  • 不得包含'..'(两个句点)

  • 不得包含'@{'

  • 不得包含ASCII控制字符

  • 不得包含以下字符:':', '?', '[', '\', '^', '~', '*'

  • 不得包含空格(空格、制表符、换行符)

  • 不得以'/'结尾

  • 不得以'.lock'结尾

  • 不得为HEAD(不区分大小写)

  • 不得与提交哈希值无法区分(32个字符,且所有字符为0-9或a-z,区分大小写)

​dolt_branch()​过程会隐式提交当前事务并开始一个新事务。

选项

​-c​, --copy​:复制分支。必须跟随要复制的源分支名称以及要创建的新分支名称。如果没有--force​选项,当新分支已存在时复制将失败。

​-m​, --move​:移动/重命名分支。必须跟随现有分支的当前名称和该分支的新名称。如果没有--force​选项,当分支正在其他服务器会话中使用时,重命名将失败。需要注意,强制重命名或删除正在其他会话中使用的分支将要求这些会话断开连接并重新连接后才能再次执行语句。

​-d​, --delete​:删除分支。必须跟随现有分支的名称。如果没有--force​选项,当分支正在其他服务器会话中使用时,删除将失败。需要注意,强制重命名或删除正在其他会话中使用的分支将要求这些会话断开连接并重新连接后才能再次执行语句。

​-f​, --force​:与--copy​选项一起使用时,允许从另一个分支重新创建分支,即使该分支已存在。与--move​或--delete​选项一起使用时,强制允许您重命名或删除正在其他活动服务器会话中使用的分支,但需要注意,这将要求其他会话断开连接并重新连接后才能再次执行语句。

​-D​:--delete --force​的快捷方式。

输出模式

+--------+------+---------------------------+
| Field  | Type | Description               |
+--------+------+---------------------------+
| status | int  | 0表示成功,1表示失败      |
+--------+------+---------------------------+

示例

-- 列出可用分支
SELECT * FROM DOLT_BRANCHES;
+--------+----------------------------------+
| name   | hash                             |
+--------+----------------------------------+
| backup | nsqtc86d54kafkuf0a24s4hqircvg68g |
| main   | dvtsgnlg7n9squriob3nq6kve6gnhkf2 |
+--------+----------------------------------+

-- 从head的顶端创建一个新的开发分支并切换到该分支
CALL DOLT_BRANCH('myNewFeature');
CALL DOLT_CHECKOUT('myNewFeature');

-- 查看当前分支
SELECT active_branch();
+----------------+
| active_branch  |
+----------------+
| myNewFeature   |
+----------------+

-- 从现有分支创建新分支
CALL DOLT_BRANCH('-c', 'backup', 'bugfix-3482');

-- 重命名分支
CALL DOLT_BRANCH('-m', 'bugfix-3482', 'critical-bugfix-3482');

-- 删除分支
CALL DOLT_BRANCH('-d', 'old-unused-branch');

​DOLT_CHECKOUT()​

切换当前会话到其他分支。

如果以表名作为参数,则将这些表恢复到当前 HEAD 中的内容。

注意,与 Git 命令行不同,如果您有已修改的工作集,在执行 DOLT_CHECKOUT()​ 后,这些更改仍保留在您修改过的分支上。未提交的工作集更改不会像在命令行中那样转移到切换到的分支上。我们在 SQL 环境中修改了此行为,因为多个用户可能同时连接到同一个分支。当用户切换分支时,将来自其他分支的更改带入会对多租户 SQL 环境造成过多干扰。

CALL DOLT_CHECKOUT('-b', 'my-new-branch');
CALL DOLT_CHECKOUT('my-existing-branch');
CALL DOLT_CHECKOUT('my-table');

注意事项

带分支参数的 DOLT_CHECKOUT()​ 会对您的会话状态产生两个副作用:

  1. 会话的当前数据库(通过 SELECT DATABASE()​ 返回)现在是未加限定的数据库名称。

  2. 在此会话的剩余时间内,对该数据库未加限定名称的引用将解析为被检出的分支。

请查看以下语句后的注释以了解此行为的示例,同时阅读 使用分支。

set autocommit = on;
use mydb/branch1; -- 当前数据库现在是 `mydb/branch1`
insert into t1 values (1); -- 修改 `branch1` 分支
call dolt_checkout('branch2'); -- 当前数据库现在是 `mydb`
insert into t1 values (2); -- 修改 `branch2` 分支
use mydb/branch3; -- 当前数据库现在是 `mydb/branch3`
insert into mydb.t1 values (3); -- 修改 `branch2` 分支

选项

​-b​: 创建一个具有指定名称的新分支。

​-B​: 类似于 -b​,但如果分支已存在,则会移动分支。

​-t​: 创建新分支时,设置“上游”配置。

输出模式

+---------+------+-----------------------------+
| Field   | Type | Description                 |
+---------+------+-----------------------------+
| status  | int  | 0 表示成功,1 表示失败      |
| message | text | 成功/失败信息               |
+---------+------+-----------------------------+

示例

-- 设置会话的当前数据库
USE mydb;

-- 创建并切换到一个新分支
CALL DOLT_CHECKOUT('-b', 'feature-branch');

-- 进行修改
UPDATE table
SET column = "new value"
WHERE pk = "key";

-- 暂存并提交所有更改
CALL DOLT_COMMIT('-a', '-m', 'committing all changes');

-- 返回到主分支
CALL DOLT_CHECKOUT('main');

​DOLT_CHERRY_PICK()​

应用现有提交引入的更改。

从现有提交应用更改,并从当前 HEAD 创建一个新的提交。

与 CLI 中的 dolt cherry-pick命令 完全一致,并具有相同的注意事项和限制。

CALL DOLT_CHERRY_PICK('my-existing-branch~2');
CALL DOLT_CHERRY_PICK('qj6ouhjvtrnp1rgbvajaohmthoru2772');

选项

​--abort​:
中止当前的冲突解决过程,并恢复 cherry-pick 操作过程中所有的更改。

​--allow-empty​:
允许 cherry-pick 空提交。请注意,使用此选项仅保留最初为空的提交。由于之前的提交导致变为空的提交,将会导致 cherry-pick 失败。

输出模式

+-----------------------+------+---------------------------------+
| Field                 | Type | Description                     |
+-----------------------+------+---------------------------------+
| hash                  | text | 应用提交的哈希值                |
| data_conflicts        | int  | 数据冲突的数量                  |
| schema_conflicts      | int  | 模式冲突的数量                  |
| constraint_violations | int  | 约束冲突的数量                  |
+-----------------------+------+---------------------------------+

示例

以下示例展示了 main​ 和 mybranch​ 分支的设置:

-- 切换到 main 分支
CALL DOLT_CHECKOUT('main');

-- 查看提交日志
SELECT commit_hash, message FROM dolt_log;
+----------------------------------+----------------------------+
| commit_hash                      | message                    |
+----------------------------------+----------------------------+
| 7e2q0hibo2m2af874i4e7isgnum74j4m | 创建新表                   |
| omuqq67att6vfnka94drdallu4983gnr | 初始化数据仓库             |
+----------------------------------+----------------------------+
2 rows in set (0.00 sec)

-- 查看表
SELECT * FROM mytable;
Empty set (0.00 sec)

-- 切换到新分支
CALL DOLT_CHECKOUT('mybranch');

-- 查看提交日志
SELECT commit_hash, message FROM dolt_log;
+----------------------------------+----------------------------+
| commit_hash                      | message                    |
+----------------------------------+----------------------------+
| 577isdjbq1951k2q4dqhli06jlauo51p | 向表中添加 3、4、5         |
| k318tpmqn4l97ofpaerato9c3m70lc14 | 向表中添加 1、2            |
| 7e2q0hibo2m2af874i4e7isgnum74j4m | 创建新表                   |
| omuqq67att6vfnka94drdallu4983gnr | 初始化数据仓库             |
+----------------------------------+----------------------------+
4 rows in set (0.00 sec)

-- 查看表
SELECT * FROM mytable;
+---+
| a |
+---+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
+---+
5 rows in set (0.00 sec)

我们希望仅 cherry-pick 提交哈希 'k318tpmqn4l97ofpaerato9c3m70lc14'​ 引入的更改,该提交将 1​ 和 2​ 插入到表中。指定 'mybranch~1'​ 代替提交哈希也可以。

-- 切换到 main 分支
CALL DOLT_CHECKOUT('main');

-- 执行 cherry-pick 操作
CALL DOLT_CHERRY_PICK('k318tpmqn4l97ofpaerato9c3m70lc14');
+----------------------------------+
| hash                             |
+----------------------------------+
| mh518gdgbsut8m705b7b5rie9neq9uaj |
+----------------------------------+
1 row in set (0.02 sec)

mydb> SELECT * FROM mytable;
+---+
| a |
+---+
| 1 |
| 2 |
+---+
2 rows in set (0.00 sec)

mydb> SELECT commit_hash, message FROM dolt_log;
+----------------------------------+----------------------------+
| commit_hash                      | message                    |
+----------------------------------+----------------------------+
| mh518gdgbsut8m705b7b5rie9neq9uaj | 向表中添加 1、2            |
| 7e2q0hibo2m2af874i4e7isgnum74j4m | 创建新表                   |
| omuqq67att6vfnka94drdallu4983gnr | 初始化数据仓库             |
+----------------------------------+----------------------------+
3 rows in set (0.00 sec)

​DOLT_CLEAN()​

删除工作集中的未跟踪表。

如果传入表名作为参数,则仅删除指定的未跟踪表。

使用 --dry-run​ 标志,可以测试删除未跟踪表是否会返回零状态。

CALL DOLT_CLEAN();
CALL DOLT_CLEAN('untracked-table');
CALL DOLT_CLEAN('--dry-run');

选项

​--dry-run​:测试从工作集中删除未跟踪表。

输出模式

+--------+------+---------------------------+
| 字段   | 类型 | 描述                      |
+--------+------+---------------------------+
| status | int  | 成功为0,失败为1          |
+--------+------+---------------------------+

示例

-- 创建三个新表
create table tracked (x int primary key);
create table committed (x int primary key);
create table untracked (x int primary key);

-- 提交第一个表
call dolt_add('committed');
call dolt_commit('-m', 'commit a table');
+----------------------------------+
| hash                             |
+----------------------------------+
| n7gle7jv6aqf72stbdicees6iduhuoo9 |
+----------------------------------+

-- 跟踪第二个表
call dolt_add('tracked');

-- 查看数据库状态
select * from dolt_status;
+------------+--------+-----------+
| table_name | staged | status    |
+------------+--------+-----------+
| tracked    | true   | new table |
| untracked  | false  | new table |
+------------+--------+-----------+

-- 清除未跟踪表
call dolt_clean('untracked');

-- 查看最终状态
select * from dolt_status;
+------------+--------+-----------+
| table_name | staged | status    |
+------------+--------+-----------+
| tracked    | true   | new table |
+------------+--------+-----------+

-- 已提交和已跟踪的表被保留
show tables;
+----------------+
| Tables_in_tmp3 |
+----------------+
| committed      |
| tracked        |
+----------------+

​DOLT_CLONE()​

在当前 Dolt 环境中,将现有的 Dolt 数据库克隆为一个新的数据库。必须将现有数据库作为参数指定,可以是指向磁盘上现有 Dolt 数据库的文件 URL,或者是远程托管数据库的 doltremote​ URL(例如托管在 DoltHub 或 DoltLab 上的数据库),也可以使用 <org>/<database>​ 的简写形式(例如 dolthub/us-jails​)来表示托管在 DoltHub 上的数据库。可以选择性地提供一个额外参数来指定新克隆数据库的名称,否则将使用现有数据库的当前名称。

注意:从文件 URL 克隆时,目前必须包含 .dolt/noms​ 子目录。更多详细信息请参阅 GitHub 跟踪问题 dolt#1860

CALL DOLT_CLONE('file:///myDatabasesDir/database/.dolt/noms');
CALL DOLT_CLONE('dolthub/us-jails', 'myCustomDbName');

选项

​--remote​:要添加到新克隆数据库的远程名称。默认值为 origin​。

​-b​, --branch​:要克隆的分支。如果未指定,将克隆所有分支。

​--depth​:仅克隆单个分支,并将历史记录限制为指定的提交深度。

输出模式

+--------+------+---------------------------+
| Field  | Type | Description               |
+--------+------+---------------------------+
| status | int  | 0 表示成功,1 表示失败       |
+--------+------+---------------------------+

示例

-- 使用 <org>/<database> 的简写形式,从 DoltHub 克隆 dolthub/us-jails 数据库。
CALL DOLT_CLONE('dolthub/us-jails');
-- 使用新克隆的数据库
-- 注意:对于带有连字符的数据库名称,需要使用反引号
USE `us-jails`;
SHOW TABLES;
+-----------------------------+
| Tables_in_us-jails          |
+-----------------------------+
| incidents                   |
| inmate_population_snapshots |
| jails                       |
+-----------------------------+

-- 克隆 dolthub/museum-collections 数据库,这次使用 doltremoteapi URL,仅克隆一个分支,
-- 自定义远程名称,并提供一个自定义数据库名称。
CALL DOLT_CLONE('-branch', 'prod', '-remote', 'dolthub',
                'https://doltremoteapi.dolthub.com/dolthub/ge-taxi-demo', 'taxis');

-- 验证是否只克隆了 prod 分支
USE taxis;
SELECT * FROM DOLT_BRANCHES;
+------+----------------------------------+------------------+------------------------+-------------------------+------------------------------+
| name | hash                             | latest_committer | latest_committer_email | latest_commit_date      | latest_commit_message        |
+------+----------------------------------+------------------+------------------------+-------------------------+------------------------------+
| prod | 1s61u4rbbd26u0tlpdhb46cuejd1dogj | oscarbatori      | oscarbatori@gmail.com  | 2021-06-14 17:52:58.702 | Added first cut of trip data |
+------+----------------------------------+------------------+------------------------+-------------------------+------------------------------+

-- 验证新克隆数据库的默认远程名称是否为 "dolthub"(而不是 "origin")
SELECT * FROM DOLT_REMOTES;
+---------+--------------------------------------------------------+-----------------------------------------+--------+
| name    | url                                                    | fetch_specs                             | params |
+---------+--------------------------------------------------------+-----------------------------------------+--------+
| dolthub | https://doltremoteapi.dolthub.com/dolthub/ge-taxi-demo | ["refs/heads/*:refs/remotes/dolthub/*"] | {}     |
+---------+--------------------------------------------------------+-----------------------------------------+--------+

​DOLT_COMMIT()​

将已暂存的表提交到 HEAD。其功能与 dolt commit​ 完全相同,每个参数紧跟在标志后面。

​DOLT_COMMIT()​ 还会提交当前事务。

CALL DOLT_COMMIT('-a', '-m', '这是一次提交');
CALL DOLT_COMMIT('-m', '这是一次提交');
CALL DOLT_COMMIT('-m', '这是一次提交', '--author', 'John Doe <johndoe@example.com>');

选项

​-m​, --message​:使用给定的 <msg>​ 作为提交信息。**必需**

​-a​, --all​:在提交之前暂存所有已修改的表(但不包括新创建的表)。

​-A​, --ALL​:在提交之前暂存所有表(包括新创建的表)。

​--allow-empty​:允许记录与其唯一父提交拥有完全相同数据的提交。通常这是一种错误,因此默认情况下会禁用此功能。此选项可绕过该安全限制。

​--skip-empty​:仅在有更改需要提交时记录提交。如果没有暂存的更改需要提交,提交操作将不会执行,而不是报错。如果 --skip-empty​ 与 --allow-empty​ 一起使用,将会抛出错误。

​--date​:指定提交中使用的日期。如果未指定,则使用当前系统时间。

​--author​:使用标准格式 "A U Thor author@example.com" 指定提交的作者。

输出模式

+-------+------+----------------------------+
| Field | Type | Description                |
+-------+------+----------------------------+
| hash  | text | 创建的提交的哈希值         |
+-------+------+----------------------------+

示例

-- 设置当前会话的数据库
USE mydb;

-- 进行修改
UPDATE table
SET column = "new value"
WHERE pk = "key";

-- 暂存所有更改并提交
CALL DOLT_COMMIT('-a', '-m', '这是一次提交', '--author', 'John Doe <johndoe@example.com>');

​DOLT_CONFLICTS_RESOLVE()​

当合并操作发现冲突更改时,会将其记录在 dolt_conflicts​ 表中。
冲突发生在两个版本之间:我们的版本(目标分支头部的行)和他们的版本(源分支头部的行)。
dolt conflicts resolve​ 会自动通过为每行选择我们的版本或他们的版本来解决冲突。

CALL DOLT_CONFLICTS_RESOLVE('--ours', <table>);
CALL DOLT_CONFLICTS_RESOLVE('--theirs', <table>);

参数选项

​<table>​:要解决冲突的表的列表。可以使用 .​ 来解决所有表的冲突。

​--ours​:对于所有冲突,选择我们分支的版本并解决冲突。

​--theirs​:对于所有冲突,选择他们分支的版本并解决冲突。

输出模式

+--------+------+---------------------------+
| Field  | Type | Description               |
+--------+------+---------------------------+
| status | int  | 成功为 0,失败为 1        |
+--------+------+---------------------------+

示例

-- 设置当前会话的数据库
USE mydb;

-- 尝试合并
CALL DOLT_MERGE('feature-branch');

-- 检查是否存在冲突
SELECT * FROM dolt_conflicts;

-- 使用我们分支的行解决表 t1 和 t2 的冲突。
CALL DOLT_CONFLICTS_RESOLVE('--ours', 't1', 't2');

​DOLT_FETCH()​

获取引用(refs)以及完成其历史记录所需的对象,并更新远程跟踪分支。其功能与 CLI 中的 dolt fetch​ 完全相同,并接受相同的参数。

CALL DOLT_FETCH('origin', 'main');
CALL DOLT_FETCH('origin', 'feature-branch');
CALL DOLT_FETCH('origin', 'refs/heads/main:refs/remotes/origin/main');
CALL DOLT_FETCH('origin', NULL);
CALL DOLT_FETCH('origin');

选项

此过程没有选项。

输出模式

+--------+------+---------------------------+
| 字段   | 类型 | 描述                      |
+--------+------+---------------------------+
| status | int  | 成功为 0,不成功为 1       |
+--------+------+---------------------------+

示例

-- 获取远程 main 分支
CALL DOLT_FETCH('origin', 'main');

-- 查看获取的远程分支的哈希值
SELECT HASHOF('origin/main');

-- 将远程 main 分支与当前分支合并
CALL DOLT_MERGE('origin/main');

注意事项

省略第二个参数或传递 NULL,将使用默认的 refspec。

​DOLT_GC()​

清理数据库中未被引用的数据。在 Dolt sql-server 上运行 dolt_gc​ 过程时,垃圾回收进行期间将阻止所有写操作。

CALL DOLT_GC();
CALL DOLT_GC('--shallow');

选项

​--shallow​ 执行更快但不够彻底的垃圾回收。

输出模式

+--------+------+---------------------------+
| Field  | Type | Description               |
+--------+------+---------------------------+
| status | int  | 成功为 0,失败为 1        |
+--------+------+---------------------------+

注意事项

为了防止并发写入可能引用垃圾回收的块,运行 call dolt_gc()​ 将会断开所有与运行服务器的开放连接。这些连接上的正在执行的查询可能会失败,需要重新尝试。在连接断开后重新建立连接是安全的。

运行结束时,执行 call dolt_gc()​ 的连接将保持打开状态,以便交付操作结果。该连接将处于终端失效状态,任何尝试在其上运行查询的操作都会产生以下错误:

ERROR 1105 (HY000): this connection was established when this server performed an online 
garbage collection. this connection can no longer be used. please reconnect.

此连接应被关闭。在某些连接池中,关闭单个连接可能会比较麻烦。如果需要以编程方式运行 call dolt_gc()​,一种解决方法是使用一个大小为 1 的单独连接池,在运行成功后可以关闭该连接池。

​DOLT_MERGE()​

将指定提交(自从其历史与当前分支分叉以来的更改)合并到当前分支。其功能与CLI中的dolt merge​完全相同,并接受相同的参数。

在事务提交或创建新的Dolt提交之前,必须解决所有生成的合并冲突。DOLT_MERGE()​会为任何成功的合并创建一个新的提交,如果未定义提交信息,则会自动生成提交信息。

CALL DOLT_MERGE('feature-branch'); -- 可选的 --squash 参数
CALL DOLT_MERGE('feature-branch', '--no-ff', '-m', '这是一个非快进合并的消息');
CALL DOLT_MERGE('--abort');

{% hint style="info" %}

注意事项

  • ​dolt_merge()​过程会隐式提交当前事务并开始一个新的事务。

{% endhint %}

选项

​--no-ff​:即使合并可以快进,也会创建一个合并提交。

​--squash​:将更改合并到工作集而不更新提交历史。

​-m <msg>, --message=<msg>​:使用给定的消息作为提交信息。此选项仅对--no-ff​提交有用。

​--abort​:中止当前的冲突解决过程,并尝试重建合并前的状态。

​--author​:使用标准格式A U Thor <author@example.com>​指定明确的作者。

在合并分支时,您的会话状态必须是干净的。请先COMMIT​或ROLLBACK​所有更改,然后使用DOLT_COMMIT()​在目标分支上创建一个新的Dolt提交。

如果合并导致冲突或约束违规,您必须在事务提交之前,通过dolt_conflicts​系统表解决这些问题。详情请参阅Dolt系统表

输出模式

+--------------+------+--------------------------------------+
| 字段         | 类型 | 描述                                 |
+--------------+------+--------------------------------------+
| hash         | text | 合并提交的哈希值                     |
| fast_forward | int  | 合并是否为快进                       |
| conflicts    | int  | 生成的冲突数量                       |
| message      | text | 可选的提示信息                       |
+--------------+------+--------------------------------------+

示例

-- 设置当前会话的数据库
USE mydb;

-- 创建并切换到新分支
CALL DOLT_CHECKOUT('-b', 'feature-branch');

-- 进行修改
UPDATE table
SET column = "new value"
WHERE pk = "key";

-- 暂存并提交所有更改
CALL DOLT_COMMIT('-a', '-m', '提交所有更改');

-- 切换回主分支
CALL DOLT_MERGE('feature-branch', '--author', 'John Doe <johndoe@example.com>');

​DOLT_PULL()​

从其他数据库或本地分支获取并集成数据。在默认模式下,dolt pull​ 是 dolt fetch​ 和 dolt merge <remote>/<branch>​ 的简写。其功能与 CLI 中的 dolt pull​ 完全相同,并接受相同的参数。

在事务提交或创建新的 Dolt 提交之前,必须解决所有合并冲突。

CALL DOLT_PULL('origin');
CALL DOLT_PULL('origin', 'some-branch');
CALL DOLT_PULL('feature-branch', '--force');

选项

​--no-ff​:即使合并可以快速前进,也会创建一个合并提交。

​--squash​:将更改合并到工作集,而不更新提交历史记录。

​--force​:忽略任何外键警告并继续提交。

在合并分支时,您的会话状态必须是干净的。请先 COMMIT​ 或 ROLLBACK​ 所有更改,然后使用 DOLT_COMMIT()​ 在目标分支上创建一个新的 Dolt 提交。

如果合并导致冲突或约束违规,您必须使用 dolt_conflicts​ 系统表解决这些问题,然后才能提交事务。详情请参阅 Dolt 系统表

输出模式

+--------------+------+-------------------------------------+
| 字段         | 类型 | 描述                                |
+--------------+------+-------------------------------------+
| fast_forward | int  | 是否为快速前进合并                 |
| conflicts    | int  | 产生的冲突数量                     |
| message      | text | 可选的提示信息                     |
+--------------+------+-------------------------------------+

示例

-- 使用远程更改更新本地工作集
-- 注意:这需要设置上游跟踪信息,以便 Dolt 知道要合并的远程分支
CALL DOLT_PULL('origin');

-- 使用指定分支的远程更改更新本地工作集
CALL DOLT_PULL('origin', 'some-branch');

-- 查看新提交的日志
SELECT * FROM dolt_log LIMIT 5;

​DOLT_PURGE_DROPPED_DATABASES()​

永久删除存储在临时保存区域中的已删除数据库。当一个 Dolt 数据库被删除时,它会被移动到一个临时保存区域,在该区域中可以通过 dolt\_undrop()存储过程 恢复它。dolt_purge_dropped_databases()​ 存储过程会清空该保存区域,并永久删除这些数据库中的所有数据。此操作不可逆,因此调用者在使用时应谨慎。使用此函数的主要好处是回收临时保存区域占用的磁盘空间。由于这是一个破坏性操作,调用者必须拥有 SUPER​ 权限才能执行。

示例

-- 创建一个数据库并在工作集中填充一个表
CREATE DATABASE database1;
use database1;
create table t(pk int primary key);

-- 删除数据库会将其移动到临时保存区域
DROP DATABASE database1;

-- 此时,可以通过调用 dolt_undrop('database1') 恢复该数据库,但
-- 我们选择通过调用 dolt_purge_dropped_databases() 永久删除它。
CALL dolt_purge_dropped_databases(); 

​DOLT_PUSH()​

使用本地引用更新远程引用,同时发送完成给定引用所需的对象。其功能与 CLI 中的 dolt push​ 完全相同,并接受相同的参数。

CALL DOLT_PUSH('origin', 'main');
CALL DOLT_PUSH('--force', 'origin', 'main');

选项

​--force​:使用本地历史记录更新远程历史记录,覆盖远程中的任何冲突历史记录。

输出模式

+---------+------+--------------------------------+
| 字段    | 类型 | 描述                           |
+---------+------+--------------------------------+
| status  | int  | 成功为 0,失败为 1             |
| message | text | 可选的提示信息                 |
+---------+------+--------------------------------+

示例

-- 切换到新分支
CALL DOLT_CHECKOUT('-b', 'feature-branch');

-- 添加一个表
CREATE TABLE test (a int primary key);

-- 创建提交
CALL DOLT_COMMIT('-a', '-m', 'create table test');

-- 推送到远程
CALL DOLT_PUSH('origin', 'feature-branch');

​DOLT_REBASE()​

通过重放提交记录重写当前分支的提交历史,从而可以重新排序、合并或删除提交记录。包含在变基计划中的提交记录是当前分支可达的提交记录,但不包括从开始变基时指定的分支(也称为上游分支)可达的提交记录。这与 Git 和 Dolt 的“双点日志”语法相同,即 |upstreamBranch|..|currentBranch|。

例如,考虑以下提交图,其中 feature​ 分支从 main​ 分支分出,并且两个分支都添加了提交记录:

A → B → C → D → E → F  main
         ↘
           G → H → I  feature

如果我们从 feature​ 分支变基,使用 main​ 分支作为上游分支,默认的变基计划将包括提交记录 G​、H​ 和 I​,因为这些提交记录是从当前分支可达的,但从上游分支不可达。默认情况下,这些提交记录的更改将按相同的顺序重新应用到上游分支 main​ 的最新提交。最终的提交图将如下所示:

A → B → C → D → E → F  main
                     ↘
                       G' → H' → I'  feature

变基在清理和组织提交历史方面非常有用,尤其是在将功能分支合并回共享分支之前。例如,您可以删除包含调试或测试更改的提交记录,将小的提交记录合并或修正为一个提交记录,或者重新排序提交记录,使相关更改在新的提交历史中相邻。

CALL DOLT_REBASE('--interactive', 'main');
CALL DOLT_REBASE('-i', 'main');
CALL DOLT_REBASE('-i', '--empty=keep', 'main');
CALL DOLT_REBASE('--continue');
CALL DOLT_REBASE('--abort');

限制

目前仅支持交互式变基。数据冲突的解决通过 Dolt 的标准冲突解决流程支持,但架构冲突的解决尚不支持。如果变基遇到架构冲突,变基将自动中止。

选项

​--interactive​ 或 -i​:启动交互式变基。目前仅支持交互式变基,因此此选项是必需的。

​--continue​:在调整存储于 dolt_rebase​ 中的变基计划后继续交互式变基。

​--abort​:中止正在进行的变基。

​--empty​:
如何处理在变基后变为空的提交记录。有效值为:drop(默认)或 keep。此选项只能在开始变基时指定,在继续变基时无效。

输出模式

+---------+------+-----------------------------+
| Field   | Type | Description                 |
+---------+------+-----------------------------+
| status  | int  | 0 表示成功,1 表示失败      |
| message | text | 成功/失败的信息             |
+---------+------+-----------------------------+

示例

-- 创建一个简单的表
create table t (pk int primary key);
call dolt_commit('-Am', 'creating table t');

-- 创建一个新分支,稍后将在其上添加更多提交记录
call dolt_branch('branch1');

-- 在 branch1 分支分出后,立即在 main 分支上创建另一个提交
insert into t values (0);
call dolt_commit('-am', 'inserting row 0');

-- 切换到 branch1 并创建三个提交记录,每个提交插入一行
call dolt_checkout('branch1');
insert into t values (1);
call dolt_commit('-am', 'inserting row 1');
insert into t values (2);
call dolt_commit('-am', 'inserting row 2');
insert into t values (3);
call dolt_commit('-am', 'inserting row 3');

-- 检查变基前 branch1 分支的提交历史
select commit_hash, message from dolt_log;
+----------------------------------+----------------------------+
| commit_hash                      | message                    |
+----------------------------------+----------------------------+
| tsq01op7b48ij6dfa2tst60vbfm9rcus | inserting row 3            |
| uou7dibe86e9939pu8fdtjdce5pt7v1c | inserting row 2            |
| 3umkjmqeeep5ho7nn0iggfinajoo1l6q | inserting row 1            |
| 35gfll6o322aq9uffdqin1dqmq7q3vek | creating table t           |
| do1tp9u39vsja3c8umshv9p6fernr0lt | 初始化数据仓库              |
+----------------------------------+----------------------------+

-- 启动交互式变基并检查默认变基计划;
-- 此操作将变基此分支上的所有新提交记录并将其移动到 main 分支的最新提交
call dolt_rebase('-i', 'main');
select * from dolt_rebase order by rebase_order;
+--------------+--------+----------------------------------+-----------------+
| rebase_order | action | commit_hash                      | commit_message  |
+--------------+--------+----------------------------------+-----------------+
| 1.00         | pick   | 3umkjmqeeep5ho7nn0iggfinajoo1l6q | inserting row 1 |
| 2.00         | pick   | uou7dibe86e9939pu8fdtjdce5pt7v1c | inserting row 2 |
| 3.00         | pick   | tsq01op7b48ij6dfa2tst60vbfm9rcus | inserting row 3 |
+--------------+--------+----------------------------------+-----------------+

-- 调整变基计划以修改第一条提交记录的消息,删除插入第 2 行的提交记录,
-- 并将第三条提交记录合并到上一条提交记录中
update dolt_rebase set action='reword', commit_message='insert rows' where rebase_order=1;
update dolt_rebase set action='drop' where rebase_order=2;
update dolt_rebase set action='fixup' where rebase_order=3;

-- 调整变基计划后继续变基
call dolt_rebase('--continue');

-- 检查提交历史
select commit_hash, message from dolt_log;
+----------------------------------+----------------------------+
| commit_hash                      | message                    |
+----------------------------------+----------------------------+
| 8jc1dpj25fv6f2kn3bd47uokc8hs1vp0 | insert rows                |
| hb9fnqnrsd5ghq3fgag0kiq6nvpsasvo | inserting row 0            |
| 35gfll6o322aq9uffdqin1dqmq7q3vek | creating table t           |
| do1tp9u39vsja3c8umshv9p6fernr0lt | 初始化数据仓库              |
+----------------------------------+----------------------------+

​DOLT_REMOTE()​

为数据库添加一个指定URL的远程仓库,或移除一个已有的远程仓库及其远程跟踪分支和配置设置。类似于CLI中的dolt remote命令,但不包括云服务提供商的相关标志。要列出现有的远程仓库,请使用dolt\_remotes系统表

CALL DOLT_REMOTE('add','remote_name','remote_url');
CALL DOLT_REMOTE('remove','existing_remote_name');

输出模式

+--------+------+---------------------------+
| 字段   | 类型 | 描述                      |
+--------+------+---------------------------+
| status | int  | 成功为0,失败为1          |
+--------+------+---------------------------+

示例

-- 添加一个HTTP远程仓库
CALL DOLT_REMOTE('add','origin','https://doltremoteapi.dolthub.com/Dolthub/museum-collections');

-- 使用URL的简写形式添加一个HTTP远程仓库
CALL DOLT_REMOTE('add','origin1','Dolthub/museum-collections');

-- 添加一个基于文件系统的远程仓库
CALL DOLT_REMOTE('add','origin2','file:///Users/jennifer/datasets/museum-collections');

-- 列出远程仓库以检查
SELECT * FROM dolt_remotes;
+---------+--------------------------------------------------------------+-----------------------------------------+--------+
| name    | url                                                          | fetch_specs                             | params |
+---------+--------------------------------------------------------------+-----------------------------------------+--------+
| origin  | https://doltremoteapi.dolthub.com/Dolthub/museum-collections | ["refs/heads/*:refs/remotes/origin/*"]  | {}     |
| origin1 | https://doltremoteapi.dolthub.com/Dolthub/museum-collections | ["refs/heads/*:refs/remotes/origin1/*"] | {}     |
| origin2 | file:///Users/jennifer/datasets/museum-collections           | ["refs/heads/*:refs/remotes/origin2/*"] | {}     |
+---------+--------------------------------------------------------------+-----------------------------------------+--------+

-- 移除一个远程仓库
CALL DOLT_REMOTE('remove','origin1');

-- 列出远程仓库以检查
SELECT * FROM dolt_remotes;
+---------+--------------------------------------------------------------+-----------------------------------------+--------+
| name    | url                                                          | fetch_specs                             | params |
+---------+--------------------------------------------------------------+-----------------------------------------+--------+
| origin  | https://doltremoteapi.dolthub.com/Dolthub/museum-collections | ["refs/heads/*:refs/remotes/origin/*"]  | {}     |
| origin2 | file:///Users/jennifer/datasets/museum-collections           | ["refs/heads/*:refs/remotes/origin2/*"] | {}     |
+---------+--------------------------------------------------------------+-----------------------------------------+--------+

​DOLT_RESET()​

默认模式将暂存表重置为其 HEAD 状态。也可以用于将数据库重置到特定的提交。其工作方式与 CLI 中的 dolt reset​ 完全相同,并接受相同的参数。

与其他数据修改操作一样,在执行重置后,必须通过 COMMIT​ 提交事务,才能使对受影响表的任何更改对其他客户端可见。

CALL DOLT_RESET('--hard', 'featureBranch');
CALL DOLT_RESET('--hard', 'commitHash123abc');
CALL DOLT_RESET('myTable'); -- 软重置

{% hint style="info" %}

注意事项

  • 使用 --hard​ 选项时,dolt_reset()​ 过程会隐式提交当前事务并开始一个新的事务。

{% endhint %}

选项

​--hard​:重置工作表和暂存表。自 <commit> 以来对工作树中已跟踪表的任何更改都将被丢弃。

​--soft​:不会修改工作表,但会移除所有暂存待提交的表。这是默认行为。

输出模式

+--------+------+---------------------------+
| 字段   | 类型 | 描述                      |
+--------+------+---------------------------+
| status | int  | 成功为 0,失败为 1        |
+--------+------+---------------------------+

示例

-- 设置当前会话的数据库
USE mydb;

-- 进行修改
UPDATE table
SET column = "new value"
WHERE pk = "key";

-- 永久重置更改
CALL DOLT_RESET('--hard');

-- 进行更多修改
UPDATE table
SET column = "new value"
WHERE pk = "key";

-- 暂存表
CALL DOLT_ADD('table');

-- 取消暂存表
CALL DOLT_RESET('table');

​DOLT_REVERT()​

撤销一个提交或一组提交中引入的更改。从当前的 HEAD 创建一个新提交,该提交会逆转所有指定提交中的更改。如果提供了多个提交,则按给定顺序应用它们。

CALL DOLT_REVERT('gtfv1qhr5le61njimcbses9oom0de41e');
CALL DOLT_REVERT('HEAD~2');
CALL DOLT_REVERT('HEAD', '--author=reverter@rev.ert');

选项

​--author=<author>​:使用标准格式 A U Thor <author@example.com>​ 指定明确的作者。

输出模式

+--------+------+---------------------------+
| 字段   | 类型 | 描述                      |
+--------+------+---------------------------+
| status | int  | 成功为 0,失败为 1         |
+--------+------+---------------------------+

示例

-- 创建一个表并通过多个提交添加数据
CREATE TABLE t1(pk INT PRIMARY KEY, c VARCHAR(255));
CALL dolt_add("t1")
CALL dolt_commit("-m", "创建表 t1");
INSERT INTO t1 VALUES(1, "a"), (2, "b"), (3, "c");
CALL dolt_commit("-am", "添加一些数据");
insert into t1 VALUES(10, "aa"), (20, "bb"), (30, "cc");
CALL dolt_commit("-am", "添加更多数据");

-- 检查当前 HEAD 提交之前的提交中所做的更改
SELECT to_pk, to_c, to_commit, diff_type FROM dolt_diff_t1 WHERE to_commit=hashof("HEAD~1");
+-------+------+----------------------------------+-----------+
| to_pk | to_c | to_commit                        | diff_type |
+-------+------+----------------------------------+-----------+
| 1     | a    | fc4fks6jutcnee9ka6458nmuot7rl1r2 | added     |
| 2     | b    | fc4fks6jutcnee9ka6458nmuot7rl1r2 | added     |
| 3     | c    | fc4fks6jutcnee9ka6458nmuot7rl1r2 | added     |
+-------+------+----------------------------------+-----------+

-- 撤销当前 HEAD 提交之前的提交
CALL dolt_revert("HEAD~1");

-- 查看由 dolt_revert 创建的新提交
SELECT commit_hash, message FROM dolt_log limit 1;
+----------------------------------+---------------------------+
| commit_hash                      | message                   |
+----------------------------------+---------------------------+
| vbevrdghj3in3napcgdsch0mq7f8en4v | Revert "Adding some data" |
+----------------------------------+---------------------------+

-- 查看撤销提交所做的具体更改
SELECT from_pk, from_c, to_commit, diff_type FROM dolt_diff_t1 WHERE to_commit=hashof("HEAD");
+---------+--------+----------------------------------+-----------+
| from_pk | from_c | to_commit                        | diff_type |
+---------+--------+----------------------------------+-----------+
| 1       | a      | vbevrdghj3in3napcgdsch0mq7f8en4v | removed   |
| 2       | b      | vbevrdghj3in3napcgdsch0mq7f8en4v | removed   |
| 3       | c      | vbevrdghj3in3napcgdsch0mq7f8en4v | removed   |
+---------+--------+----------------------------------+-----------+

​DOLT_TAG()​

创建一个指向指定提交引用的新标签,或者删除一个已存在的标签。其功能与命令行中的dolt tag​命令完全相同,并接受除列出标签之外的相同参数。要列出现有标签,请使用dolt\_tags​系统表。

CALL DOLT_TAG('tag_name', 'commit_ref');
CALL DOLT_TAG('-m', 'message', 'tag_name', 'commit_ref');
CALL DOLT_TAG('-m', 'message', '--author', 'John Doe <johndoe@example.com>', 'tag_name', 'commit_ref');
CALL DOLT_TAG('-d', 'tag_name');

选项

​-m​:使用指定的消息作为标签信息。

​-d​:删除一个标签。

​--author​:使用标准格式"A U Thor author@example.com"指定明确的作者。

输出模式

+--------+------+---------------------------+
| Field  | Type | Description               |
+--------+------+---------------------------+
| status | int  | 成功返回0,失败返回1      |
+--------+------+---------------------------+

示例

-- 设置当前会话的数据库
USE mydb;

-- 进行修改
UPDATE table
SET column = "new value"
WHERE pk = "key";

-- 暂存并提交所有更改。
CALL DOLT_COMMIT('-am', 'committing all changes');

-- 为HEAD提交创建一个标签。
CALL DOLT_TAG('v1','head','-m','creating v1 tag');

​DOLT_UNDROP()​

恢复已删除的数据库。有关如何永久删除已删除的数据库,请参阅dolt_purge_dropped_databases()存储过程

CALL DOLT_UNDROP(<database_name>);

选项

​dolt_undrop()​ 接受一个参数——要恢复的已删除数据库的名称。如果在没有任何参数的情况下调用 dolt_undrop()​,将返回一条错误消息,其中包含所有可恢复的已删除数据库的列表。

示例

-- 创建一个数据库并在工作集内填充一个表
CREATE DATABASE database1;
use database1;
create table t(pk int primary key);

-- 删除数据库会将其移动到一个临时存储区域
DROP DATABASE database1;
   
-- 在没有参数的情况下调用 dolt_undrop() 会返回一条错误消息,
-- 其中列出了所有可恢复的已删除数据库
CALL dolt_undrop();

-- 使用 dolt_undrop() 恢复数据库
CALL dolt_undrop('database1');
SELECT * FROM database1.t;

使用说明

已删除的数据库会被移动到 Dolt 数据目录中的 .dolt_dropped_databases​ 目录。如果具有相同名称的数据库被多次删除,之前的副本将被重命名为 <database_name>.backup.<timestamp>​。这使您即使在数据库被重新创建并再次删除的情况下,也可以恢复之前的版本。要恢复之前的版本,请将备份目录重命名为原始数据库名称,然后调用 dolt_undrop('<database_name>')​。如果您未重命名目录并在调用 dolt_undrop()​ 时使用带有时间戳的名称,则数据库将以包含时间戳的名称恢复。

​DOLT_VERIFY_CONSTRAINTS()​

验证工作集中的更改(插入、更新和/或删除)是否满足已定义的表约束。如果有任何约束被违反,它们将被写入到 DOLT_CONSTRAINT_VIOLATIONS 表中。

默认情况下,DOLT_VERIFY_CONSTRAINTS​ 不会检测之前已提交的行更改的约束。可以指定 --all​ 选项来验证数据库中的所有行。如果在之前的提交中禁用了 FOREIGN_KEY_CHECKS​,您可能需要使用 --all​ 选项以确保当前状态的一致性,并且不会遗漏任何违反的约束。

参数和选项

​<table>​:要检查约束的表。如果省略,则检查所有表。

​-a​, --all​:
对每一行验证约束。

​-o​, --output-only​:
禁用将结果写入 DOLT_CONSTRAINT_VIOLATIONS 系统表。

输出模式

+------------+------+-----------------------------------------+
| Field      | Type | Description                             |
+------------+------+-----------------------------------------+
| violations | int  | 如果发现违规为 1,否则为 0              |
+------------+------+-----------------------------------------+

示例

以下示例基于以下模式:

CREATE TABLE parent (
  pk int PRIMARY KEY
);

CREATE TABLE child (
  pk int PRIMARY KEY,
  parent_fk int,
  FOREIGN KEY (parent_fk) REFERENCES parent(pk)
);

一个简单的案例:

-- 启用 dolt_force_transaction_commit,以便我们可以检查工作集中的违规
SET dolt_force_transaction_commit = ON;
SET FOREIGN_KEY_CHECKS = OFF;
INSERT INTO PARENT VALUES (1);
-- 违反了子表的外键约束
INSERT INTO CHILD VALUES (1, -1);

CALL DOLT_VERIFY_CONSTRAINTS();
/*
+------------+
| violations |
+------------+
| 1          |
+------------+
*/

SELECT * from dolt_constraint_violations;
/*
+-------+----------------+
| table | num_violations |
+-------+----------------+
| child | 1              |
+-------+----------------+
*/

SELECT violation_type, pk, parent_fk from dolt_constraint_violations_child;
/*
+----------------+----+-----------+
| violation_type | pk | parent_fk |
+----------------+----+-----------+
| foreign key    | 1  | -1        |
+----------------+----+-----------+
*/

使用 --all​ 验证所有行:

SET DOLT_FORCE_TRANSACTION_COMMIT = ON;
SET FOREIGN_KEY_CHECKS = OFF;
INSERT INTO PARENT VALUES (1);
INSERT INTO CHILD VALUES (1, -1);
CALL DOLT_COMMIT('-am', 'violating rows');

CALL DOLT_VERIFY_CONSTRAINTS();
/*
由于工作集中没有更改,因此未返回违规。

+------------+
| violations |
+------------+
| 0          |
+------------+
*/

SELECT * from dolt_constraints_violations_child;
/*
+----------------+----+-----------+----------------+
| violation_type | pk | parent_fk | violation_info |
+----------------+----+-----------+----------------+
+----------------+----+-----------+----------------+
*/

CALL DOLT_VERIFY_CONSTRAINTS('--all');
/*
当考虑所有行时,发现约束违规。

+------------+
| violations |
+------------+
| 1          |
+------------+
*/

SELECT * from dolt_constraint_violations_child;
/*
+----------------+----+-----------+
| violation_type | pk | parent_fk |
+----------------+----+-----------+
| foreign key    | 1  | -1        |
+----------------+----+-----------+
*/

仅检查特定表:

SET DOLT_FORCE_TRANSACTION_COMMIT = ON;
SET FOREIGN_KEY_CHECKS = OFF;
INSERT INTO PARENT VALUES (1);
INSERT INTO CHILD VALUES (1, -1);

CALL DOLT_VERIFY_CONSTRAINTS('parent');
/*
+------------+
| violations |
+------------+
| 0          |
+------------+
*/

CALL DOLT_VERIFY_CONSTRAINTS('child');
/*
+------------+
| violations |
+------------+
| 1          |
+------------+
*/

SELECT * from dolt_constraint_violations_child;
/*
+----------------+----+-----------+
| violation_type | pk | parent_fk |
+----------------+----+-----------+
| foreign key    | 1  | -1        |
+----------------+----+-----------+
*/

统计更新

控制函数用于启动和停止与统计更新相关的后台线程活动。
有关更多信息,请参阅统计文档

​dolt_stats_restart()​

如果当前数据库没有活动线程,则使用当前会话的时间间隔和阈值参数(dolt_stats_auto_refresh_interval​ 和 dolt_stats_auto_refresh_threshold​)启动一个新的更新线程。如果该数据库已经有活动线程,则会停止当前线程并使用新的参数重新启动。

​dolt_stats_stop()​

停止当前数据库的更新线程(否则无操作)。

​dolt_stats_status()​

返回当前数据库最新的统计信息更新。

​dolt_stats_drop()​

删除磁盘上的统计信息引用,并清除当前数据库在内存中的数据库统计信息。
如果更新线程处于活动状态,则停止该线程。

​dolt_stats_prune()​

垃圾回收统计缓存存储,仅保留最新的统计更新。此操作后需要重新启动后台线程。

​dolt_stats_purge()​

从文件系统中删除旧的统计信息缓存。这可以用来消除由于不兼容的升级导致的警告。统计信息需要重新收集,这可能会耗费时间。

权限控制

Dolt存储过程通过GRANT权限系统进行访问控制。MySQL数据库权限会传递到表和过程层面,拥有数据库Execute权限的用户将对该数据库的所有过程拥有Execute权限。对于敏感操作,Dolt在此行为上略有不同。请参阅下文的管理过程

需要使用Dolt常见功能(如向分支添加和提交更改)的用户,需要在相关数据库上被授予Execute权限。作为特权用户,您可以使用以下命令授予访问权限:

mydb> GRANT EXECUTE ON mydb.* TO pat@localhost

这将赋予用户pat​运行该数据库上所有存储过程的权限,包括Dolt过程和用户定义的过程。如果您需要更细粒度的权限控制,可以单独授予权限:

mydb> GRANT EXECUTE ON PROCEDURE mydb.dolt_commit TO pat@localhost

如果需要移除某项功能的访问权限,可以按以下方式使用REVOKE命令:

mydb> REVOKE EXECUTE ON PROCEDURE mydb.dolt_commit FROM pat@localhost
mydb> REVOKE EXECUTE ON mydb.* FROM pat@localhost

管理程序

以下程序被视为管理程序,因此用户需要明确授权才能使用它们。

  • dolt_backup

  • dolt_clone

  • dolt_fetch

  • dolt_undrop

  • dolt_purge_dropped_databases

  • dolt_gc

  • dolt_pull

  • dolt_push

  • dolt_remote

例如,如果一个服务账户需要启动 dolt_gc​ 的权限,则必须授予其特定的权限:

database> GRANT EXECUTE ON PROCEDURE mydb.dolt_gc TO service_account@localhost

目前,dolt_push()​、dolt_fetch()​ 和 dolt_pull()​ 被认为是管理操作,因为它们都使用共享凭证与远程服务器通信。用户级对远程服务器的访问权限,以及存储用户级凭证的功能已在我们的路线图中规划。

root 用户或任何拥有超级权限的用户均可调用所有程序。

  • 1