From 3b222b7623a0a44da50b3576ca3540547e04abf8 Mon Sep 17 00:00:00 2001 From: Gygkimo95 Date: Fri, 12 Apr 2024 14:22:02 +0800 Subject: [PATCH 01/13] =?UTF-8?q?eclipse=E6=96=B0=E5=A2=9Etoken=E6=96=B9?= =?UTF-8?q?=E5=BC=8F=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/dev-manual/auditplugins/jetbrains.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/dev-manual/auditplugins/jetbrains.md b/docs/dev-manual/auditplugins/jetbrains.md index 2b426bf5b..fa4b8891c 100644 --- a/docs/dev-manual/auditplugins/jetbrains.md +++ b/docs/dev-manual/auditplugins/jetbrains.md @@ -38,6 +38,7 @@ title: IDEA审核插件 |http/https按钮|指定连接SQLE的方式| |UserName|登录SQLE使用的用户名| |Password|登录SQLE使用的密码| +|token|登录SQLE时使用的访问令牌| |Test Connection|测试连接是否成功, 将会尝试登录| |DB Type|当其他配置正确时,该下拉框会自动获取支持审核的实例类型。选择实例类型后,平台将使用该实例类型应用的审核规则进行审核| |Data Source|选择使用的数据源| From 4ea2a40accbd2dd4a104970a47fe6d955c437e0c Mon Sep 17 00:00:00 2001 From: Gygkimo95 Date: Fri, 12 Apr 2024 14:56:53 +0800 Subject: [PATCH 02/13] =?UTF-8?q?=E6=96=B0=E5=A2=9EIDE=E5=AE=A1=E6=A0=B8?= =?UTF-8?q?=E8=AE=B0=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/user-manual/project/IDEaudit.md | 34 ++++++++++++++++++++++++++++ sidebars.js | 1 + 2 files changed, 35 insertions(+) create mode 100644 docs/user-manual/project/IDEaudit.md diff --git a/docs/user-manual/project/IDEaudit.md b/docs/user-manual/project/IDEaudit.md new file mode 100644 index 000000000..968d37dc9 --- /dev/null +++ b/docs/user-manual/project/IDEaudit.md @@ -0,0 +1,34 @@ +--- +title: IDE审核 +--- + +# IDE审核 + + +### 使用场景 +本功能适用于管理员和开发团队,旨在实现将IDE工具中生成的SQL审核同步到SQLE平台,以便管理员能够查看开发人员的审核记录和使用统计。这将帮助管理员了解开发团队的使用情况,进行性能优化和资源管理。 + +## 前置操作: + +在开始使用本功能之前,请确保完成以下操作: + +* 请确保插件已正确安装和配置,以确保SQL审核记录能够成功同步到SQLE平台。 + +:::tip +目前SQLE已提供了IDEA和Eclipse的审核插件 +* IDEA审核插件配置请参考[IDEA插件配置](docs/dev-manual/auditplugins/jetbrains.md) +* Eclipse审核插件配置请参考[Eclipse插件配置](/docs/dev-manual/auditplugins/eclipse.md) +::: + + +## 使用步骤: +下面是将IDE生成的SQL审核同步到SQLE平台的详细步骤: + +### 生成SQL审核记录 +在IDE工具中创建或编辑SQL脚本,并执行审核操作。 + +### 查看审核记录和使用统计 +登录到SQLE平台,导航到IDE审核记录页面。你将能够查看在IDE工具中生成的SQL审核记录,包括原始SQL和触发的规则。此外,你还可以获取有关开发团队的使用统计信息,如执行次数、执行时间等。 + +## 后续操作 +根据审核记录和使用统计,管理员可以了解开发团队的SQL审核情况。这将有助于进行性能优化和资源管理,例如识别慢查询、优化SQL语句、调整资源分配等。 diff --git a/sidebars.js b/sidebars.js index 9e3c64700..9aab7b47d 100644 --- a/sidebars.js +++ b/sidebars.js @@ -59,6 +59,7 @@ const sidebars = { "user-manual/project/sqlmanage", "user-manual/project/dataexport", "user-manual/project/quick_audit", + "user-manual/project/IDEaudit", { type: 'category', label: '工单', From ca6a30c718ddcdcd942145b6d45bf9f9547a9ef7 Mon Sep 17 00:00:00 2001 From: Gygkimo95 Date: Fri, 12 Apr 2024 15:08:53 +0800 Subject: [PATCH 03/13] =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E6=96=B0=E5=A2=9E=E6=94=AF=E6=8C=81=E7=9A=84=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E6=BA=90=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/user-manual/project/dataexport.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/user-manual/project/dataexport.md b/docs/user-manual/project/dataexport.md index 8d4a9ecf0..cd823c45b 100644 --- a/docs/user-manual/project/dataexport.md +++ b/docs/user-manual/project/dataexport.md @@ -8,6 +8,12 @@ title: 数据导出 当您需要使用数据但没有足够的权限时,可以利用数据导出功能获取需要的数据。平台通过预检查及审批流程确保数据的安全访问,并记录详细的数据导出信息,包括导出人员、导出目的及导出的数据等内容,有助于审核人全面了解数据的使用情况,从而更好地保障数据安全。 +## 支持的数据源类型 +* MySQL +* PG +* Oracle +* SQL Server + ## 前置条件 在进行以下操作之前,请先创建两个成员,分别配置其在数据源上有`创建数据导出任务`、`审批/驳回数据导出工单`的权限、 From 6c9fce300104d81188f764164647d529b01867c0 Mon Sep 17 00:00:00 2001 From: Gygkimo95 Date: Fri, 12 Apr 2024 15:18:15 +0800 Subject: [PATCH 04/13] =?UTF-8?q?scanner=E4=BF=AE=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E5=BE=80dms=E6=9C=8D=E5=8A=A1=E5=8F=91=E9=80=81=E8=AF=B7?= =?UTF-8?q?=E6=B1=82=E5=86=8D=E7=94=B1dms=E8=BF=9B=E8=A1=8C=E8=BD=AC?= =?UTF-8?q?=E5=8F=91=E8=87=B3sqle=EF=BC=8C=E6=89=80=E4=BB=A5=E5=BA=94?= =?UTF-8?q?=E8=AF=A5=E5=A1=AB=E5=86=99dms=E6=89=80=E5=9C=A8=E4=B8=BB?= =?UTF-8?q?=E6=9C=BA=E5=92=8C=E7=AB=AF=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/user-manual/project/audit_task/SQLfile_audit.md | 4 ++-- docs/user-manual/project/audit_task/mybatis.md | 4 ++-- docs/user-manual/project/audit_task/slowlog_audit.md | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/user-manual/project/audit_task/SQLfile_audit.md b/docs/user-manual/project/audit_task/SQLfile_audit.md index ca0116e48..578d1b956 100644 --- a/docs/user-manual/project/audit_task/SQLfile_audit.md +++ b/docs/user-manual/project/audit_task/SQLfile_audit.md @@ -33,8 +33,8 @@ title: SQL文件扫描 参数解释如下: * -J, --project:说明扫描任务所在项目,例如“default”; -* -H, --host string:指定SQLE主机所在地址; -* -P, --port string:指定SQLE所在端口; +* -H, --host string:指定dms主机所在地址; +* -P, --port string:指定dms所在端口; * -N, --name string:指定扫描任务名称,scannerd会将获得的SQL传至指定的任务池中审核; * -D, --dir string:指定要扫描的SQL文件路径; * -A, --token string:输入扫描任务凭证token; diff --git a/docs/user-manual/project/audit_task/mybatis.md b/docs/user-manual/project/audit_task/mybatis.md index 1a1adb859..d3f8e7784 100644 --- a/docs/user-manual/project/audit_task/mybatis.md +++ b/docs/user-manual/project/audit_task/mybatis.md @@ -36,8 +36,8 @@ title: MyBatis扫描 参数解释如下: * -J, --project:说明扫描任务所在项目,例如“default”; -* -H, --host string:指定SQLE主机所在地址; -* -P, --port string:指定SQLE所在端口; +* -H, --host string:指定dms主机所在地址; +* -P, --port string:指定dms所在端口; * -N, --name string:指定扫描任务名称,scannerd会将获得的SQL传至指定的任务池中审核; * -D, --dir string:指定要扫描的XML文件路径 * -A, --token string:输入扫描任务凭证token; diff --git a/docs/user-manual/project/audit_task/slowlog_audit.md b/docs/user-manual/project/audit_task/slowlog_audit.md index 3abf56263..959173fa3 100644 --- a/docs/user-manual/project/audit_task/slowlog_audit.md +++ b/docs/user-manual/project/audit_task/slowlog_audit.md @@ -55,7 +55,7 @@ long_query_time = 1 //设置慢查询时间阈值,当前示例时间为1s, 参数解释如下: * -J, --project:说明扫描任务所在项目,例“default”; -* -H, --host string:指定SQLE主机所在地址; +* -H, --host string:指定dms主机所在地址; * -N, --name string:指定扫描任务名称,scannerd会将获得的慢SQL传至指定的任务池中审核; * -P, --port string:指定SQLE所在端口; * -A, --token string:输入扫描任务凭证token; From d8d1bee8699638f4adf56fd4a82bc5bb65aefdf0 Mon Sep 17 00:00:00 2001 From: Gygkimo95 Date: Fri, 12 Apr 2024 15:24:05 +0800 Subject: [PATCH 05/13] =?UTF-8?q?oauth2.0=E6=94=AF=E6=8C=81=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E5=88=9B=E5=BB=BA=E7=94=A8=E6=88=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/user-manual/sys-configuration/login_syn.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/user-manual/sys-configuration/login_syn.md b/docs/user-manual/sys-configuration/login_syn.md index 1ecbcd7d7..984a5bb42 100644 --- a/docs/user-manual/sys-configuration/login_syn.md +++ b/docs/user-manual/sys-configuration/login_syn.md @@ -57,7 +57,8 @@ SQLE中支持通过配置的方式接入OAuth 2.0系统, 如同其他系统一 * 请求资源范围:此范围由验证服务器定义 * access_token放置位置:SQLE会在获取用户ID时将access_token放在这个key对应的value中, 此参数会作为get请求的参数发送给用户ID获取地址 * 用户ID保存位置:SQLE会尝试使用此key从第三方平台的响应中解析出用户ID,用户ID应当为唯一ID -* 登录按钮文字 +* 登录按钮文字:用于登录页面按钮提示 +* 自动创建并绑定用户:若开启,在通过OAuth2登陆时,若该用户未绑定SQLE用户,SQLE则会根据从OAuth2服务端获取的用户id创建SQLE账户,并且不会跳转到绑定界面,而是进入SQLE主界面 :::tip 当仅允许内网访问SQLE服务时,请确保回调地址的后缀为"/v1/oauth2/callback"。 From 5d67d2838bd4cd8a6c6681c6191c3dd23b2b33db Mon Sep 17 00:00:00 2001 From: Gygkimo95 Date: Fri, 12 Apr 2024 15:31:41 +0800 Subject: [PATCH 06/13] =?UTF-8?q?=E6=94=AF=E6=8C=81=E4=B8=8B=E8=BD=BDSQL?= =?UTF-8?q?=E5=AF=BC=E5=87=BA=E5=B7=A5=E5=8D=95=E7=9A=84SQL=E8=AF=AD?= =?UTF-8?q?=E5=8F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/user-manual/project/dataexport.md | 5 ++++- docs/user-manual/project/img/exportdownload.png | Bin 0 -> 58794 bytes 2 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 docs/user-manual/project/img/exportdownload.png diff --git a/docs/user-manual/project/dataexport.md b/docs/user-manual/project/dataexport.md index cd823c45b..ba363b73f 100644 --- a/docs/user-manual/project/dataexport.md +++ b/docs/user-manual/project/dataexport.md @@ -46,6 +46,7 @@ title: 数据导出 * 如果审批不通过,审批人点击 "驳回",并填写驳回原因。 * 如果审批通过,由工单创建人执行导出操作。 + ### 下载导出文件 要下载导出文件,请按照以下步骤进行操作: 1. 以user1账号登录DMS平台,进入导出工单详情,点击执行导出。 @@ -53,4 +54,6 @@ title: 数据导出 ![exportresult](img/exportresult.png) - +### 后续操作 +当您需要审计导出语句时,可以进入导出工单详情,下载SQL语句 +![exportdownload](img/exportdownload.png) \ No newline at end of file diff --git a/docs/user-manual/project/img/exportdownload.png b/docs/user-manual/project/img/exportdownload.png new file mode 100644 index 0000000000000000000000000000000000000000..5609a2673b39101f371fc9777bafa529517f5c68 GIT binary patch literal 58794 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 Date: Fri, 12 Apr 2024 15:32:45 +0800 Subject: [PATCH 07/13] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E7=94=A8=E9=80=94?= =?UTF-8?q?=E6=8F=8F=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/user-manual/project/dataexport.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/user-manual/project/dataexport.md b/docs/user-manual/project/dataexport.md index ba363b73f..86a35283c 100644 --- a/docs/user-manual/project/dataexport.md +++ b/docs/user-manual/project/dataexport.md @@ -55,5 +55,5 @@ title: 数据导出 ![exportresult](img/exportresult.png) ### 后续操作 -当您需要审计导出语句时,可以进入导出工单详情,下载SQL语句 +当您需要线下人工审核SQL语句,或是事后审计时,可以进入导出工单详情,下载SQL语句 ![exportdownload](img/exportdownload.png) \ No newline at end of file From f6ee37575a5512a7e69d202a8f889eb59d1e3533 Mon Sep 17 00:00:00 2001 From: Gygkimo95 Date: Fri, 12 Apr 2024 15:37:38 +0800 Subject: [PATCH 08/13] =?UTF-8?q?java=E6=8F=92=E4=BB=B6=E4=B8=8D=E9=9C=80?= =?UTF-8?q?=E8=A6=81=E5=86=8D=E5=9C=A8=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E4=B8=AD=E6=8C=87=E5=AE=9A=E6=89=A7=E8=A1=8C=E6=8C=87=E4=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/dev-manual/plugins/howtouse.md | 72 +---------------------------- 1 file changed, 2 insertions(+), 70 deletions(-) diff --git a/docs/dev-manual/plugins/howtouse.md b/docs/dev-manual/plugins/howtouse.md index a5bdd72d4..54d905f9b 100644 --- a/docs/dev-manual/plugins/howtouse.md +++ b/docs/dev-manual/plugins/howtouse.md @@ -25,7 +25,7 @@ drwxr-x--- 4 actiontech-universe actiontech 112 12月 8 03:19 static * dms组件中,需要在database_driver_options部分配置数据库logo存储路径、变量信息,详细配置信息请参考[配置文件说明](/docs/deploy-manual/config.md) * sqle组件中,根据数据源类型的不同,目前有两种不同的配置文件书写方式。用户应根据实际情况选择相应的配置方式进行填写。 ::: -```jsx title="config.yaml # 针对PostgreSQL、SQL server、TiDB、OceanBase For MySQL类型的数据源" +```jsx title="config.yaml " dms: id: 1 api: @@ -84,78 +84,10 @@ sqle: mysql_schema: 'sqle' ``` -```jsx title="config.yaml # 针对Oracle和DB2类型的数据源,须先在SQLE环境中安装JDK" -dms: - id: 1 - api: - addr: 0.0.0.0 - port: 7601 - service: - database: - username: root - password: root - host: 127.0.0.1 - port: 3306 - database: dms - debug: true - log: - level: DEBUG - path: logs - max_size_mb: 100 - max_backup_number: 10 - cloudbeaver: - enable_https: false - host: 172.41.134.5 - port: 8978 - admin_user: administrator - admin_password: 123456 - secret_key: - database_driver_options: ## 需要配置数据库logo存储路径、变量信息 - - db_type: MySQL - logo_path: "/logo/mysql.png" - params: - - db_type: DB2 - logo_path: "/static/logo/db2.png" - params: [ - { - "key":"database_name", - "value":"", - "desc":"数据库名", - "type":"string" - }, - ] -sqle: - id: 1 - dms_server_address: http://127.0.0.1:7601 - api: - addr: 127.0.0.1 - port: 10000 - enable_https: false - cert_file_path: './etc/cert.pem' - key_file_path: './etc/key.pem' - secret_key: - service: - auto_migrate_table: true - debug_log: false - log_path: './logs' - log_max_size_mb: 1024 - log_max_backup_number: 2 - plugin_path: './plugins' ## 插件所在路径,也可以填写绝对路径 - plugin_config: - - plugin_name: 'sqle-db2-plugin.jar' ## 填写插件文件名称 - cmd: 'java -jar /opt/sqle/plugins/sqle-db2-plugin.jar' ## 填写插件启动指令及插件绝对路径 - enable_cluster_mode: - database: - mysql_host: '127.0.0.1' - mysql_port: '3306' - mysql_user: 'root' - mysql_password: 'root' - mysql_schema: 'sqle' -``` :::tip 1. 针对Oracle和DB2类型的数据源,须先在SQLE环境中安装JDK yum install java-1.8.0-openjdk* -y -2. 针对Sql-Server类型的数据源,需要安装 .net 6.0 版本 +1. 针对Sql-Server类型的数据源,需要安装 .net 6.0 版本 * unbuntu * apt-get install -y dotnet-sdk-6.0 * centos From bb5a87971df7ea964726f2bf2508a748653e8442 Mon Sep 17 00:00:00 2001 From: Gygkimo95 Date: Mon, 15 Apr 2024 11:14:40 +0800 Subject: [PATCH 09/13] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E4=B8=AA=E4=BA=BA?= =?UTF-8?q?=E4=B8=AD=E5=BF=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/dev-manual/auditplugins/eclipse.md | 4 +-- docs/user-manual/user-manager/account.md | 46 ++++++++++++++++++++++++ sidebars.js | 1 + 3 files changed, 49 insertions(+), 2 deletions(-) create mode 100644 docs/user-manual/user-manager/account.md diff --git a/docs/dev-manual/auditplugins/eclipse.md b/docs/dev-manual/auditplugins/eclipse.md index 2ef97b5f3..8e3eaf617 100644 --- a/docs/dev-manual/auditplugins/eclipse.md +++ b/docs/dev-manual/auditplugins/eclipse.md @@ -27,7 +27,7 @@ Eclipse审核插件可以在开发阶段实时进行自助式的SQL审核,确 2. 选择HTTP连接方式 3. 输入登录信息 1. 选择账号密码登录时,需要填写用于登录的账密信息 - 2. 选择token登录时,需要填写在个人中心生成的访问令牌 + 2. 选择token登录时,需要填写在个人中心生成的[访问令牌](../../user-manual/user-manager/account.md) 4. 点击`Test Connection`按钮,确保能够成功连接到SQLE并获取项目和数据库类型列表。 3. 选择审核的数据对象 1. 依次选择Project、DB Type、Data Source和Schema下拉框,配置要进行审核的数据库信息。 @@ -65,4 +65,4 @@ Eclipse审核插件可以在开发阶段实时进行自助式的SQL审核,确 ::: ### 后续操作 -Eclipse中产生的审核操作,将同步记录到SQLE平台,您可以在平台查看历史审核记录。 \ No newline at end of file +Eclipse中产生的审核操作,将同步记录到SQLE平台,您可以在平台查看[历史审核记录](../../user-manual/project/IDEaudit.md)。 \ No newline at end of file diff --git a/docs/user-manual/user-manager/account.md b/docs/user-manual/user-manager/account.md new file mode 100644 index 000000000..a2064565b --- /dev/null +++ b/docs/user-manual/user-manager/account.md @@ -0,0 +1,46 @@ +--- +title: 个人中心 +--- + + +个人中心页面提供以下功能: + +* 修改邮箱:允许您更新个人账户绑定的邮箱地址。 +* 修改企业微信userid:允许您更新与企业微信关联的用户ID。 +* 修改手机:允许您更新个人账户绑定的手机号码。 +* 生成个人访问token:允许您生成用于访问个人账户的访问令牌。 + + +## 使用场景 +当您需要修改个人账户信息和生成访问令牌时,可以进入个人中心编辑。 + +## 入口 +1. 登录SQLE平台 +2. 点击右下角头像图标,选择`个人中心`进入 + + +## 使用步骤 +### 修改邮箱 + +* 定位到`邮箱`选项并点击编辑图标。 +* 输入新的邮箱地址。 +* 点击保存或确认按钮以应用更改。 + +### 修改企业微信userid + +* 定位到`企业微信userid`选项并点击编辑图标。 +* 输入新的userid。 +* 点击保存或确认按钮以应用更改。 + +### 修改手机 + +* 定位到`手机`选项并点击编辑图标。 +* 输入新的手机号。 +* 点击保存或确认按钮以应用更改。 + + +### 生成个人访问token +* 定位到`生成个人访问token`选项并点击,设置访问令牌的失效时间。 +* 系统将生成一个唯一的访问令牌。 +* 复制该访问令牌以备将来使用或记录下来。 +* 访问令牌可用于访问个人账户的受限资源或进行身份验证。 \ No newline at end of file diff --git a/sidebars.js b/sidebars.js index 9aab7b47d..98a74a120 100644 --- a/sidebars.js +++ b/sidebars.js @@ -117,6 +117,7 @@ const sidebars = { "user-manual/user-manager/intro", "user-manual/user-manager/user", "user-manual/user-manager/role", + "user-manual/user-manager/account", ], }, "user-manual/customrule", From 11957840817c24c2ef72c7f6463f1ca66096fc8b Mon Sep 17 00:00:00 2001 From: Gygkimo95 Date: Mon, 15 Apr 2024 11:35:07 +0800 Subject: [PATCH 10/13] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=E5=AF=B9=E6=AF=94=E9=A1=B5=E9=9D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/support/compare.md | 56 +++++++++++++++++++++++++++++++---------- 1 file changed, 43 insertions(+), 13 deletions(-) diff --git a/docs/support/compare.md b/docs/support/compare.md index 252282292..312ff5ad9 100644 --- a/docs/support/compare.md +++ b/docs/support/compare.md @@ -13,7 +13,7 @@ title: 功能对比 企业版 - 支持的数据源类型 + 支持的数据源类型 MySQL ✅ ✅ @@ -78,6 +78,12 @@ title: 功能对比 ✅ + + + GoldenDB + + + ✅ 审核方式 @@ -167,8 +173,8 @@ title: 功能对比 SQL下钻分析 - - + ✅ + ✅ ✅ @@ -374,7 +380,7 @@ title: 功能对比 ✅ - 对接能力 + 对接能力 用户对接:LDAP ✅ ✅ @@ -387,43 +393,49 @@ title: 功能对比 ✅ - 消息通知:邮件告警 + 邮件告警 ✅ ✅ ✅ - 消息通知:微信企业号告警 + 微信企业号告警 ✅ ✅ ✅ - 消息通知:飞书告警 - ✅ - ✅ + 微信企业号审批 + + ✅ - 流程对接:钉钉在线审批 + 飞书告警 ✅ ✅ ✅ - 流程对接:飞书在线审批 + 飞书在线审批 ✅ - OpenAPI:提供完整的标准接口方案 + 钉钉在线审批 + + + ✅ + + + webhook告警 ✅ ✅ ✅ - webhook告警 + OpenAPI:提供完整的标准接口方案 ✅ ✅ ✅ @@ -491,6 +503,7 @@ title: 功能对比 √ √ + √ SQL上下文 @@ -499,6 +512,7 @@ title: 功能对比 √ + √ 元数据检查 @@ -507,6 +521,7 @@ title: 功能对比 √ √ √ + √ SQL回滚 @@ -515,6 +530,7 @@ title: 功能对比 + √ 上线中止 @@ -523,6 +539,7 @@ title: 功能对比 √ √ √ + √ 扫描任务 @@ -532,6 +549,7 @@ title: 功能对比 + 慢日志 @@ -540,6 +558,7 @@ title: 功能对比 + Processlist @@ -548,6 +567,7 @@ title: 功能对比 + TopSQL @@ -556,6 +576,7 @@ title: 功能对比 √ + √ TiDB审计日志 @@ -564,6 +585,7 @@ title: 功能对比 √ + MyBatis @@ -572,6 +594,7 @@ title: 功能对比 √ + √ 阿里RDS MySQL慢日志 @@ -580,6 +603,7 @@ title: 功能对比 + 阿里RDS MySQL审计日志 @@ -588,6 +612,7 @@ title: 功能对比 + 百度云RDS MySQL慢日志扫描 @@ -596,6 +621,7 @@ title: 功能对比 + SQL文件扫描 @@ -604,6 +630,7 @@ title: 功能对比 √ √ √ + √ 应用程序抓取 @@ -612,6 +639,7 @@ title: 功能对比 √ √ √ + √ 自定义 @@ -620,6 +648,7 @@ title: 功能对比 √ √ √ + √ 其他 @@ -629,6 +658,7 @@ title: 功能对比 146 117 119 + 83 From b965c064e54527c154e4bab6bbd5ca3ef328ef08 Mon Sep 17 00:00:00 2001 From: Gygkimo95 Date: Mon, 29 Apr 2024 14:17:52 +0800 Subject: [PATCH 11/13] =?UTF-8?q?=E6=8F=92=E4=BB=B6=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=9B=B4=E6=96=B0=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/dev-manual/plugins/howtouse.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/dev-manual/plugins/howtouse.md b/docs/dev-manual/plugins/howtouse.md index 54d905f9b..070d453d8 100644 --- a/docs/dev-manual/plugins/howtouse.md +++ b/docs/dev-manual/plugins/howtouse.md @@ -21,9 +21,7 @@ drwxr-x--- 4 actiontech-universe actiontech 112 12月 8 03:19 static ``` ### 修改配置文件config.yaml :::tip -配置插件时,主要注意两个方面的配置 -* dms组件中,需要在database_driver_options部分配置数据库logo存储路径、变量信息,详细配置信息请参考[配置文件说明](/docs/deploy-manual/config.md) -* sqle组件中,根据数据源类型的不同,目前有两种不同的配置文件书写方式。用户应根据实际情况选择相应的配置方式进行填写。 +注意:dms组件中,需要在database_driver_options部分配置数据库logo存储路径、变量信息,详细配置信息请参考[配置文件说明](/docs/deploy-manual/config.md) ::: ```jsx title="config.yaml " dms: From 6f882d24ed87b03626df29d146c760262b872191 Mon Sep 17 00:00:00 2001 From: Gygkimo95 Date: Mon, 29 Apr 2024 14:18:42 +0800 Subject: [PATCH 12/13] =?UTF-8?q?SQL=20Server=E5=8F=96=E6=B6=88=E7=A9=BA?= =?UTF-8?q?=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/dev-manual/plugins/howtouse.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/dev-manual/plugins/howtouse.md b/docs/dev-manual/plugins/howtouse.md index 070d453d8..f2d2437c3 100644 --- a/docs/dev-manual/plugins/howtouse.md +++ b/docs/dev-manual/plugins/howtouse.md @@ -85,7 +85,7 @@ sqle: :::tip 1. 针对Oracle和DB2类型的数据源,须先在SQLE环境中安装JDK yum install java-1.8.0-openjdk* -y -1. 针对Sql-Server类型的数据源,需要安装 .net 6.0 版本 +1. 针对Sql Server类型的数据源,需要安装 .net 6.0 版本 * unbuntu * apt-get install -y dotnet-sdk-6.0 * centos From 41105115b12f4878565b8d1a91e5a4e04e656998 Mon Sep 17 00:00:00 2001 From: Gygkimo95 Date: Mon, 29 Apr 2024 14:30:02 +0800 Subject: [PATCH 13/13] =?UTF-8?q?=E5=8A=9F=E8=83=BD=E5=AF=B9=E6=AF=94?= =?UTF-8?q?=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/support/compare.md | 42 ++++++++++++----------------------------- 1 file changed, 12 insertions(+), 30 deletions(-) diff --git a/docs/support/compare.md b/docs/support/compare.md index 312ff5ad9..1bd5e3b26 100644 --- a/docs/support/compare.md +++ b/docs/support/compare.md @@ -503,7 +503,6 @@ title: 功能对比 √ √ - √ SQL上下文 @@ -512,7 +511,6 @@ title: 功能对比 √ - √ 元数据检查 @@ -521,7 +519,6 @@ title: 功能对比 √ √ √ - √ SQL回滚 @@ -530,7 +527,6 @@ title: 功能对比 - √ 上线中止 @@ -539,7 +535,6 @@ title: 功能对比 √ √ √ - √ 扫描任务 @@ -549,7 +544,6 @@ title: 功能对比 - 慢日志 @@ -558,7 +552,6 @@ title: 功能对比 - Processlist @@ -567,7 +560,6 @@ title: 功能对比 - TopSQL @@ -576,7 +568,6 @@ title: 功能对比 √ - √ TiDB审计日志 @@ -585,7 +576,6 @@ title: 功能对比 √ - MyBatis @@ -594,7 +584,6 @@ title: 功能对比 √ - √ 阿里RDS MySQL慢日志 @@ -603,7 +592,6 @@ title: 功能对比 - 阿里RDS MySQL审计日志 @@ -612,7 +600,6 @@ title: 功能对比 - 百度云RDS MySQL慢日志扫描 @@ -621,7 +608,6 @@ title: 功能对比 - SQL文件扫描 @@ -630,7 +616,6 @@ title: 功能对比 √ √ √ - √ 应用程序抓取 @@ -639,7 +624,6 @@ title: 功能对比 √ √ √ - √ 自定义 @@ -648,7 +632,6 @@ title: 功能对比 √ √ √ - √ 其他 @@ -658,12 +641,11 @@ title: 功能对比 146 117 119 - 83 ### 非MySQL系 - +
@@ -682,7 +664,7 @@ title: 功能对比 - + @@ -691,7 +673,7 @@ title: 功能对比 - + @@ -700,7 +682,7 @@ title: 功能对比 - + @@ -709,7 +691,7 @@ title: 功能对比 - + @@ -718,7 +700,7 @@ title: 功能对比 - + @@ -728,7 +710,7 @@ title: 功能对比 - + @@ -755,7 +737,7 @@ title: 功能对比 - + @@ -809,7 +791,7 @@ title: 功能对比 - + @@ -818,7 +800,7 @@ title: 功能对比 - + @@ -827,7 +809,7 @@ title: 功能对比 - + @@ -837,6 +819,6 @@ title: 功能对比 - +
SQL上下文
元数据检查
SQL回滚
上线中止
扫描任务
慢日志
TiDB审计日志
应用程序抓取
自定义
其他60 21 23 83
\ No newline at end of file