fdb2 1.0.7 → 1.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.dockerignore +21 -21
- package/.editorconfig +11 -11
- package/.eslintrc.cjs +14 -14
- package/.eslintrc.json +7 -7
- package/.prettierrc.js +3 -3
- package/.tpl.env +21 -21
- package/.vscodeignore +45 -45
- package/README.md +312 -312
- package/bin/build.sh +28 -28
- package/bin/deploy.sh +8 -8
- package/bin/dev.sh +10 -10
- package/bin/docker/dev-docker-compose.yml +43 -43
- package/bin/docker/dev.Dockerfile +24 -24
- package/bin/docker/prod-docker-compose.yml +17 -17
- package/bin/docker/prod.Dockerfile +29 -29
- package/bin/fdb2.js +220 -220
- package/dist/package.json +29 -29
- package/dist/pnpm-lock.yaml +1042 -354
- package/dist/public/explorer.css +1464 -1437
- package/dist/public/explorer.js +764 -226
- package/dist/public/index.css +1026 -1026
- package/dist/public/index.js +15 -9
- package/dist/public/layout.css +221 -221
- package/dist/public/layout.js +1 -1
- package/dist/public/vue.js +8 -2
- package/dist/scripts/preinstall.js +112 -112
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +8 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.ts +680 -671
- package/dist/server/model/connection.entity.ts +65 -65
- package/dist/server/model/database.entity.ts +245 -245
- package/dist/server/service/connection.service.d.ts +6 -1
- package/dist/server/service/connection.service.d.ts.map +1 -1
- package/dist/server/service/connection.service.js +15 -0
- package/dist/server/service/connection.service.js.map +1 -1
- package/dist/server/service/connection.service.ts +356 -341
- package/dist/server/service/database/base.service.d.ts +27 -0
- package/dist/server/service/database/base.service.d.ts.map +1 -1
- package/dist/server/service/database/base.service.js +17 -0
- package/dist/server/service/database/base.service.js.map +1 -1
- package/dist/server/service/database/base.service.ts +406 -367
- package/dist/server/service/database/cockroachdb.service.d.ts +16 -0
- package/dist/server/service/database/cockroachdb.service.d.ts.map +1 -1
- package/dist/server/service/database/cockroachdb.service.js +220 -154
- package/dist/server/service/database/cockroachdb.service.js.map +1 -1
- package/dist/server/service/database/cockroachdb.service.ts +871 -782
- package/dist/server/service/database/database.service.d.ts +4 -0
- package/dist/server/service/database/database.service.d.ts.map +1 -1
- package/dist/server/service/database/database.service.js +123 -0
- package/dist/server/service/database/database.service.js.map +1 -1
- package/dist/server/service/database/database.service.ts +775 -638
- package/dist/server/service/database/index.ts +6 -6
- package/dist/server/service/database/mongodb.service.d.ts +16 -0
- package/dist/server/service/database/mongodb.service.d.ts.map +1 -1
- package/dist/server/service/database/mongodb.service.js +35 -0
- package/dist/server/service/database/mongodb.service.js.map +1 -1
- package/dist/server/service/database/mongodb.service.ts +39 -1
- package/dist/server/service/database/mssql.service.d.ts +16 -0
- package/dist/server/service/database/mssql.service.d.ts.map +1 -1
- package/dist/server/service/database/mssql.service.js +168 -96
- package/dist/server/service/database/mssql.service.js.map +1 -1
- package/dist/server/service/database/mssql.service.ts +931 -840
- package/dist/server/service/database/mysql.service.d.ts +16 -0
- package/dist/server/service/database/mysql.service.d.ts.map +1 -1
- package/dist/server/service/database/mysql.service.js +189 -80
- package/dist/server/service/database/mysql.service.js.map +1 -1
- package/dist/server/service/database/mysql.service.ts +1025 -890
- package/dist/server/service/database/oracle.service.d.ts +16 -0
- package/dist/server/service/database/oracle.service.d.ts.map +1 -1
- package/dist/server/service/database/oracle.service.js +182 -120
- package/dist/server/service/database/oracle.service.js.map +1 -1
- package/dist/server/service/database/oracle.service.ts +1035 -959
- package/dist/server/service/database/postgres.service.d.ts +16 -0
- package/dist/server/service/database/postgres.service.d.ts.map +1 -1
- package/dist/server/service/database/postgres.service.js +154 -88
- package/dist/server/service/database/postgres.service.js.map +1 -1
- package/dist/server/service/database/postgres.service.ts +960 -871
- package/dist/server/service/database/sap.service.d.ts +16 -0
- package/dist/server/service/database/sap.service.d.ts.map +1 -1
- package/dist/server/service/database/sap.service.js +66 -0
- package/dist/server/service/database/sap.service.js.map +1 -1
- package/dist/server/service/database/sap.service.ts +89 -0
- package/dist/server/service/database/sqlite.service.d.ts +16 -0
- package/dist/server/service/database/sqlite.service.d.ts.map +1 -1
- package/dist/server/service/database/sqlite.service.js +77 -18
- package/dist/server/service/database/sqlite.service.js.map +1 -1
- package/dist/server/service/database/sqlite.service.ts +787 -708
- package/dist/server/service/session.service.ts +158 -158
- package/dist/view/index.html +38 -38
- package/env.d.ts +1 -1
- package/package.json +1 -1
- package/packages/vscode/.vscodeignore +44 -44
- package/packages/vscode/README.md +62 -62
- package/packages/vscode/out/database-services/cockroachdb.service.js +154 -154
- package/packages/vscode/out/database-services/mssql.service.js +96 -96
- package/packages/vscode/out/database-services/mysql.service.js +80 -80
- package/packages/vscode/out/database-services/oracle.service.js +120 -120
- package/packages/vscode/out/database-services/postgres.service.js +88 -88
- package/packages/vscode/out/database-services/sqlite.service.js +18 -18
- package/packages/vscode/out/provider/WebViewProvider.js +32 -32
- package/packages/vscode/package.json +142 -142
- package/packages/vscode/resources/icon.svg +5 -5
- package/packages/vscode/resources/webview/connection.css +41 -41
- package/packages/vscode/resources/webview/database.css +163 -163
- package/packages/vscode/resources/webview/index.html +9 -9
- package/packages/vscode/resources/webview/modules/header.tpl +13 -13
- package/packages/vscode/resources/webview/modules/initial_state.tpl +54 -54
- package/packages/vscode/resources/webview/query.css +104 -104
- package/packages/vscode/src/database-services/base.service.ts +362 -362
- package/packages/vscode/src/database-services/cockroachdb.service.ts +659 -659
- package/packages/vscode/src/database-services/connection.service.ts +340 -340
- package/packages/vscode/src/database-services/database.service.ts +629 -629
- package/packages/vscode/src/database-services/index.ts +6 -6
- package/packages/vscode/src/database-services/model/connection.entity.ts +65 -65
- package/packages/vscode/src/database-services/model/database.entity.ts +245 -245
- package/packages/vscode/src/database-services/mssql.service.ts +722 -722
- package/packages/vscode/src/database-services/mysql.service.ts +760 -760
- package/packages/vscode/src/database-services/oracle.service.ts +831 -831
- package/packages/vscode/src/database-services/postgres.service.ts +740 -740
- package/packages/vscode/src/database-services/sqlite.service.ts +558 -558
- package/packages/vscode/src/extension.ts +76 -76
- package/packages/vscode/src/provider/DatabaseTreeProvider.ts +167 -167
- package/packages/vscode/src/provider/WebViewProvider.ts +277 -277
- package/packages/vscode/src/service/DatabaseServiceBridge.ts +414 -414
- package/packages/vscode/src/typings/connection.ts +90 -90
- package/packages/vscode/tsconfig.json +21 -21
- package/public/index.html +9 -9
- package/public/modules/header.tpl +13 -13
- package/public/modules/initial_state.tpl +54 -54
- package/scripts/preinstall.js +112 -112
- package/server/index.ts +680 -671
- package/server/model/connection.entity.ts +65 -65
- package/server/model/database.entity.ts +245 -245
- package/server/service/connection.service.ts +356 -341
- package/server/service/database/base.service.ts +406 -367
- package/server/service/database/cockroachdb.service.ts +871 -782
- package/server/service/database/database.service.ts +775 -638
- package/server/service/database/index.ts +6 -6
- package/server/service/database/mongodb.service.ts +39 -1
- package/server/service/database/mssql.service.ts +931 -840
- package/server/service/database/mysql.service.ts +1025 -890
- package/server/service/database/oracle.service.ts +1035 -959
- package/server/service/database/postgres.service.ts +960 -871
- package/server/service/database/sap.service.ts +89 -0
- package/server/service/database/sqlite.service.ts +787 -708
- package/server/service/session.service.ts +158 -158
- package/server/tsconfig.json +20 -20
- package/server.js +149 -149
- package/server.pid +1 -0
- package/src/adapter/ajax.ts +135 -135
- package/src/assets/base.css +1 -1
- package/src/assets/database.css +949 -949
- package/src/assets/images/svg/illustrations/illustration-1.svg +1 -1
- package/src/assets/images/svg/illustrations/illustration-2.svg +2 -2
- package/src/assets/images/svg/illustrations/illustration-3.svg +50 -50
- package/src/assets/images/svg/illustrations/illustration-4.svg +1 -1
- package/src/assets/images/svg/illustrations/illustration-5.svg +73 -73
- package/src/assets/images/svg/illustrations/illustration-6.svg +89 -89
- package/src/assets/images/svg/illustrations/illustration-7.svg +39 -39
- package/src/assets/images/svg/separators/curve-2.svg +3 -3
- package/src/assets/images/svg/separators/curve.svg +3 -3
- package/src/assets/images/svg/separators/line.svg +3 -3
- package/src/assets/logo.svg +73 -73
- package/src/assets/main.css +1 -1
- package/src/base/config.ts +20 -20
- package/src/base/detect.ts +134 -134
- package/src/base/entity.ts +92 -92
- package/src/base/eventBus.ts +36 -36
- package/src/components/connection-editor/index.vue +588 -588
- package/src/components/dataGrid/index.vue +104 -104
- package/src/components/dataGrid/pagination.vue +105 -105
- package/src/components/loading/index.vue +42 -42
- package/src/components/modal/index.ts +180 -180
- package/src/components/modal/index.vue +560 -560
- package/src/components/toast/index.ts +43 -43
- package/src/components/toast/toast.vue +57 -57
- package/src/components/user/name.vue +103 -103
- package/src/components/user/selector.vue +416 -416
- package/src/domain/SysConfig.ts +74 -74
- package/src/platform/App.vue +7 -7
- package/src/platform/database/components/connection-detail.vue +1153 -1154
- package/src/platform/database/components/data-editor.vue +477 -477
- package/src/platform/database/components/database-detail.vue +1173 -1172
- package/src/platform/database/components/database-monitor.vue +1085 -1085
- package/src/platform/database/components/db-tools.vue +1264 -816
- package/src/platform/database/components/query-history.vue +1348 -1348
- package/src/platform/database/components/sql-executor.vue +737 -737
- package/src/platform/database/components/sql-query-editor.vue +1045 -1045
- package/src/platform/database/components/table-detail.vue +1375 -1376
- package/src/platform/database/components/table-editor.vue +916 -916
- package/src/platform/database/explorer.vue +1839 -1839
- package/src/platform/database/index.vue +1192 -1192
- package/src/platform/database/layout.vue +366 -366
- package/src/platform/database/router.ts +36 -36
- package/src/platform/database/styles/common.scss +601 -601
- package/src/platform/database/types/common.ts +444 -444
- package/src/platform/database/utils/export.ts +231 -231
- package/src/platform/database/utils/helpers.ts +436 -436
- package/src/platform/index.ts +32 -32
- package/src/platform/router.ts +40 -40
- package/src/platform/vscode/bridge.ts +121 -121
- package/src/platform/vscode/components/ConnectionPanel.vue +272 -272
- package/src/platform/vscode/components/DatabasePanel.vue +532 -532
- package/src/platform/vscode/components/QueryPanel.vue +371 -371
- package/src/platform/vscode/entry/connection.ts +13 -13
- package/src/platform/vscode/entry/database.ts +13 -13
- package/src/platform/vscode/entry/query.ts +13 -13
- package/src/platform/vscode/index.ts +5 -5
- package/src/service/base.ts +133 -127
- package/src/service/database.ts +505 -495
- package/src/service/login.ts +120 -120
- package/src/shims-vue.d.ts +6 -6
- package/src/stores/connection.ts +266 -266
- package/src/stores/session.ts +87 -87
- package/src/typings/database-types.ts +412 -412
- package/src/typings/database.ts +363 -363
- package/src/typings/global.d.ts +58 -58
- package/src/typings/pinia.d.ts +7 -7
- package/src/utils/clipboard.ts +29 -29
- package/src/utils/database-types.ts +242 -242
- package/src/utils/modal.ts +123 -123
- package/src/utils/request.ts +55 -55
- package/src/utils/sleep.ts +3 -3
- package/src/utils/toast.ts +73 -73
- package/src/utils/util.ts +171 -171
- package/src/utils/xlsx.ts +228 -228
- package/tsconfig.json +33 -33
- package/view/index.html +9 -9
- package/view/modules/header.tpl +13 -13
- package/view/modules/initial_state.tpl +19 -19
- package/vite.config.ts +424 -424
- package/vite.config.vscode.ts +47 -47
- package/server/backups/db_ai_breakout_2026-03-11T08-38-48-677Z.sql +0 -0
|
@@ -49,15 +49,15 @@ class CockroachDBService extends base_service_1.BaseDatabaseService {
|
|
|
49
49
|
* 获取CockroachDB数据库列表
|
|
50
50
|
*/
|
|
51
51
|
async getDatabases(dataSource) {
|
|
52
|
-
const result = await dataSource.query(`
|
|
53
|
-
SELECT
|
|
54
|
-
database_name as name
|
|
55
|
-
FROM
|
|
56
|
-
information_schema.databases
|
|
57
|
-
WHERE
|
|
58
|
-
database_name NOT IN ('system', 'pg_catalog', 'information_schema', 'crdb_internal')
|
|
59
|
-
ORDER BY
|
|
60
|
-
database_name
|
|
52
|
+
const result = await dataSource.query(`
|
|
53
|
+
SELECT
|
|
54
|
+
database_name as name
|
|
55
|
+
FROM
|
|
56
|
+
information_schema.databases
|
|
57
|
+
WHERE
|
|
58
|
+
database_name NOT IN ('system', 'pg_catalog', 'information_schema', 'crdb_internal')
|
|
59
|
+
ORDER BY
|
|
60
|
+
database_name
|
|
61
61
|
`);
|
|
62
62
|
return result.map((row) => row.name);
|
|
63
63
|
}
|
|
@@ -65,18 +65,18 @@ class CockroachDBService extends base_service_1.BaseDatabaseService {
|
|
|
65
65
|
* 获取CockroachDB表列表
|
|
66
66
|
*/
|
|
67
67
|
async getTables(dataSource, database) {
|
|
68
|
-
const result = await dataSource.query(`
|
|
69
|
-
SELECT
|
|
70
|
-
t.table_name as name,
|
|
71
|
-
'table' as type,
|
|
72
|
-
obj_description(t.oid) as comment
|
|
73
|
-
FROM
|
|
74
|
-
information_schema.tables t
|
|
75
|
-
WHERE
|
|
76
|
-
t.table_schema = $1
|
|
77
|
-
AND t.table_type = 'BASE TABLE'
|
|
78
|
-
ORDER BY
|
|
79
|
-
t.table_name
|
|
68
|
+
const result = await dataSource.query(`
|
|
69
|
+
SELECT
|
|
70
|
+
t.table_name as name,
|
|
71
|
+
'table' as type,
|
|
72
|
+
obj_description(t.oid) as comment
|
|
73
|
+
FROM
|
|
74
|
+
information_schema.tables t
|
|
75
|
+
WHERE
|
|
76
|
+
t.table_schema = $1
|
|
77
|
+
AND t.table_type = 'BASE TABLE'
|
|
78
|
+
ORDER BY
|
|
79
|
+
t.table_name
|
|
80
80
|
`, [database]);
|
|
81
81
|
return result.map((row) => ({
|
|
82
82
|
name: row.name,
|
|
@@ -91,34 +91,34 @@ class CockroachDBService extends base_service_1.BaseDatabaseService {
|
|
|
91
91
|
* 获取CockroachDB列信息
|
|
92
92
|
*/
|
|
93
93
|
async getColumns(dataSource, database, table) {
|
|
94
|
-
const result = await dataSource.query(`
|
|
95
|
-
SELECT
|
|
96
|
-
column_name as name,
|
|
97
|
-
data_type as type,
|
|
98
|
-
is_nullable as nullable,
|
|
99
|
-
column_default as defaultValue,
|
|
100
|
-
CASE
|
|
101
|
-
WHEN column_name IN (
|
|
102
|
-
SELECT column_name
|
|
103
|
-
FROM information_schema.key_column_usage
|
|
104
|
-
WHERE table_schema = $1
|
|
105
|
-
AND table_name = $2
|
|
106
|
-
AND constraint_name LIKE '%_pkey'
|
|
107
|
-
) THEN true
|
|
108
|
-
ELSE false
|
|
109
|
-
END as isPrimary,
|
|
110
|
-
CASE
|
|
111
|
-
WHEN data_type LIKE '%serial%' OR data_type LIKE '%identity%'
|
|
112
|
-
THEN true
|
|
113
|
-
ELSE false
|
|
114
|
-
END as isAutoIncrement
|
|
115
|
-
FROM
|
|
116
|
-
information_schema.columns
|
|
117
|
-
WHERE
|
|
118
|
-
table_schema = $1
|
|
119
|
-
AND table_name = $2
|
|
120
|
-
ORDER BY
|
|
121
|
-
ordinal_position
|
|
94
|
+
const result = await dataSource.query(`
|
|
95
|
+
SELECT
|
|
96
|
+
column_name as name,
|
|
97
|
+
data_type as type,
|
|
98
|
+
is_nullable as nullable,
|
|
99
|
+
column_default as defaultValue,
|
|
100
|
+
CASE
|
|
101
|
+
WHEN column_name IN (
|
|
102
|
+
SELECT column_name
|
|
103
|
+
FROM information_schema.key_column_usage
|
|
104
|
+
WHERE table_schema = $1
|
|
105
|
+
AND table_name = $2
|
|
106
|
+
AND constraint_name LIKE '%_pkey'
|
|
107
|
+
) THEN true
|
|
108
|
+
ELSE false
|
|
109
|
+
END as isPrimary,
|
|
110
|
+
CASE
|
|
111
|
+
WHEN data_type LIKE '%serial%' OR data_type LIKE '%identity%'
|
|
112
|
+
THEN true
|
|
113
|
+
ELSE false
|
|
114
|
+
END as isAutoIncrement
|
|
115
|
+
FROM
|
|
116
|
+
information_schema.columns
|
|
117
|
+
WHERE
|
|
118
|
+
table_schema = $1
|
|
119
|
+
AND table_name = $2
|
|
120
|
+
ORDER BY
|
|
121
|
+
ordinal_position
|
|
122
122
|
`, [database, table]);
|
|
123
123
|
return result.map((row) => ({
|
|
124
124
|
name: row.name,
|
|
@@ -133,28 +133,28 @@ class CockroachDBService extends base_service_1.BaseDatabaseService {
|
|
|
133
133
|
* 获取CockroachDB索引信息
|
|
134
134
|
*/
|
|
135
135
|
async getIndexes(dataSource, database, table) {
|
|
136
|
-
const result = await dataSource.query(`
|
|
137
|
-
SELECT
|
|
138
|
-
i.relname as name,
|
|
139
|
-
CASE
|
|
140
|
-
WHEN i.indisunique THEN 'UNIQUE'
|
|
141
|
-
ELSE 'INDEX'
|
|
142
|
-
END as type,
|
|
143
|
-
array_agg(a.attname ORDER BY k.n) as columns,
|
|
144
|
-
i.indisunique as unique
|
|
145
|
-
FROM
|
|
146
|
-
pg_index i
|
|
147
|
-
JOIN pg_class t ON t.oid = i.indrelid
|
|
148
|
-
JOIN pg_namespace n ON n.oid = t.relnamespace
|
|
149
|
-
JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY(i.indkey)
|
|
150
|
-
CROSS JOIN LATERAL unnest(i.indkey) WITH ORDINALITY AS k(n, ord) ON true
|
|
151
|
-
WHERE
|
|
152
|
-
n.nspname = $1
|
|
153
|
-
AND t.relname = $2
|
|
154
|
-
GROUP BY
|
|
155
|
-
i.relname, i.indisunique
|
|
156
|
-
ORDER BY
|
|
157
|
-
i.relname
|
|
136
|
+
const result = await dataSource.query(`
|
|
137
|
+
SELECT
|
|
138
|
+
i.relname as name,
|
|
139
|
+
CASE
|
|
140
|
+
WHEN i.indisunique THEN 'UNIQUE'
|
|
141
|
+
ELSE 'INDEX'
|
|
142
|
+
END as type,
|
|
143
|
+
array_agg(a.attname ORDER BY k.n) as columns,
|
|
144
|
+
i.indisunique as unique
|
|
145
|
+
FROM
|
|
146
|
+
pg_index i
|
|
147
|
+
JOIN pg_class t ON t.oid = i.indrelid
|
|
148
|
+
JOIN pg_namespace n ON n.oid = t.relnamespace
|
|
149
|
+
JOIN pg_attribute a ON a.attrelid = t.oid AND a.attnum = ANY(i.indkey)
|
|
150
|
+
CROSS JOIN LATERAL unnest(i.indkey) WITH ORDINALITY AS k(n, ord) ON true
|
|
151
|
+
WHERE
|
|
152
|
+
n.nspname = $1
|
|
153
|
+
AND t.relname = $2
|
|
154
|
+
GROUP BY
|
|
155
|
+
i.relname, i.indisunique
|
|
156
|
+
ORDER BY
|
|
157
|
+
i.relname
|
|
158
158
|
`, [database, table]);
|
|
159
159
|
return result.map((row) => ({
|
|
160
160
|
name: row.name,
|
|
@@ -167,30 +167,30 @@ class CockroachDBService extends base_service_1.BaseDatabaseService {
|
|
|
167
167
|
* 获取CockroachDB外键信息
|
|
168
168
|
*/
|
|
169
169
|
async getForeignKeys(dataSource, database, table) {
|
|
170
|
-
const result = await dataSource.query(`
|
|
171
|
-
SELECT
|
|
172
|
-
tc.constraint_name as name,
|
|
173
|
-
kcu.column_name as column,
|
|
174
|
-
ccu.table_name as referencedTable,
|
|
175
|
-
ccu.column_name as referencedColumn,
|
|
176
|
-
rc.update_rule as onUpdate,
|
|
177
|
-
rc.delete_rule as onDelete
|
|
178
|
-
FROM
|
|
179
|
-
information_schema.table_constraints tc
|
|
180
|
-
JOIN information_schema.key_column_usage kcu
|
|
181
|
-
ON tc.constraint_name = kcu.constraint_name
|
|
182
|
-
AND tc.table_schema = kcu.table_schema
|
|
183
|
-
JOIN information_schema.constraint_column_usage ccu
|
|
184
|
-
ON ccu.constraint_name = tc.constraint_name
|
|
185
|
-
AND ccu.table_schema = tc.table_schema
|
|
186
|
-
JOIN information_schema.referential_constraints rc
|
|
187
|
-
ON rc.constraint_name = tc.constraint_name
|
|
188
|
-
WHERE
|
|
189
|
-
tc.constraint_type = 'FOREIGN KEY'
|
|
190
|
-
AND tc.table_schema = $1
|
|
191
|
-
AND tc.table_name = $2
|
|
192
|
-
ORDER BY
|
|
193
|
-
tc.constraint_name
|
|
170
|
+
const result = await dataSource.query(`
|
|
171
|
+
SELECT
|
|
172
|
+
tc.constraint_name as name,
|
|
173
|
+
kcu.column_name as column,
|
|
174
|
+
ccu.table_name as referencedTable,
|
|
175
|
+
ccu.column_name as referencedColumn,
|
|
176
|
+
rc.update_rule as onUpdate,
|
|
177
|
+
rc.delete_rule as onDelete
|
|
178
|
+
FROM
|
|
179
|
+
information_schema.table_constraints tc
|
|
180
|
+
JOIN information_schema.key_column_usage kcu
|
|
181
|
+
ON tc.constraint_name = kcu.constraint_name
|
|
182
|
+
AND tc.table_schema = kcu.table_schema
|
|
183
|
+
JOIN information_schema.constraint_column_usage ccu
|
|
184
|
+
ON ccu.constraint_name = tc.constraint_name
|
|
185
|
+
AND ccu.table_schema = tc.table_schema
|
|
186
|
+
JOIN information_schema.referential_constraints rc
|
|
187
|
+
ON rc.constraint_name = tc.constraint_name
|
|
188
|
+
WHERE
|
|
189
|
+
tc.constraint_type = 'FOREIGN KEY'
|
|
190
|
+
AND tc.table_schema = $1
|
|
191
|
+
AND tc.table_name = $2
|
|
192
|
+
ORDER BY
|
|
193
|
+
tc.constraint_name
|
|
194
194
|
`, [database, table]);
|
|
195
195
|
return result.map((row) => ({
|
|
196
196
|
name: row.name,
|
|
@@ -206,13 +206,13 @@ class CockroachDBService extends base_service_1.BaseDatabaseService {
|
|
|
206
206
|
*/
|
|
207
207
|
async getDatabaseSize(dataSource, database) {
|
|
208
208
|
try {
|
|
209
|
-
const result = await dataSource.query(`
|
|
210
|
-
SELECT
|
|
211
|
-
pg_database_size(datname) as size
|
|
212
|
-
FROM
|
|
213
|
-
pg_database
|
|
214
|
-
WHERE
|
|
215
|
-
datname = $1
|
|
209
|
+
const result = await dataSource.query(`
|
|
210
|
+
SELECT
|
|
211
|
+
pg_database_size(datname) as size
|
|
212
|
+
FROM
|
|
213
|
+
pg_database
|
|
214
|
+
WHERE
|
|
215
|
+
datname = $1
|
|
216
216
|
`, [database]);
|
|
217
217
|
return result[0]?.size || 0;
|
|
218
218
|
}
|
|
@@ -224,16 +224,16 @@ class CockroachDBService extends base_service_1.BaseDatabaseService {
|
|
|
224
224
|
* 获取CockroachDB视图列表
|
|
225
225
|
*/
|
|
226
226
|
async getViews(dataSource, database) {
|
|
227
|
-
const result = await dataSource.query(`
|
|
228
|
-
SELECT
|
|
229
|
-
table_name as name,
|
|
230
|
-
view_definition as definition
|
|
231
|
-
FROM
|
|
232
|
-
information_schema.views
|
|
233
|
-
WHERE
|
|
234
|
-
table_schema = $1
|
|
235
|
-
ORDER BY
|
|
236
|
-
table_name
|
|
227
|
+
const result = await dataSource.query(`
|
|
228
|
+
SELECT
|
|
229
|
+
table_name as name,
|
|
230
|
+
view_definition as definition
|
|
231
|
+
FROM
|
|
232
|
+
information_schema.views
|
|
233
|
+
WHERE
|
|
234
|
+
table_schema = $1
|
|
235
|
+
ORDER BY
|
|
236
|
+
table_name
|
|
237
237
|
`, [database]);
|
|
238
238
|
return result.map((row) => ({
|
|
239
239
|
name: row.name,
|
|
@@ -246,14 +246,14 @@ class CockroachDBService extends base_service_1.BaseDatabaseService {
|
|
|
246
246
|
* 获取CockroachDB视图定义
|
|
247
247
|
*/
|
|
248
248
|
async getViewDefinition(dataSource, database, viewName) {
|
|
249
|
-
const result = await dataSource.query(`
|
|
250
|
-
SELECT
|
|
251
|
-
view_definition as definition
|
|
252
|
-
FROM
|
|
253
|
-
information_schema.views
|
|
254
|
-
WHERE
|
|
255
|
-
table_schema = $1
|
|
256
|
-
AND table_name = $2
|
|
249
|
+
const result = await dataSource.query(`
|
|
250
|
+
SELECT
|
|
251
|
+
view_definition as definition
|
|
252
|
+
FROM
|
|
253
|
+
information_schema.views
|
|
254
|
+
WHERE
|
|
255
|
+
table_schema = $1
|
|
256
|
+
AND table_name = $2
|
|
257
257
|
`, [database, viewName]);
|
|
258
258
|
return result[0]?.definition || '';
|
|
259
259
|
}
|
|
@@ -261,19 +261,19 @@ class CockroachDBService extends base_service_1.BaseDatabaseService {
|
|
|
261
261
|
* 获取CockroachDB存储过程列表
|
|
262
262
|
*/
|
|
263
263
|
async getProcedures(dataSource, database) {
|
|
264
|
-
const result = await dataSource.query(`
|
|
265
|
-
SELECT
|
|
266
|
-
p.proname as name,
|
|
267
|
-
pg_get_userbyid(p.proowner).usename as owner,
|
|
268
|
-
pg_get_functiondef(p.oid) as definition
|
|
269
|
-
FROM
|
|
270
|
-
pg_proc p
|
|
271
|
-
JOIN pg_namespace n ON n.oid = p.pronamespace
|
|
272
|
-
WHERE
|
|
273
|
-
n.nspname = $1
|
|
274
|
-
AND p.prokind = 'f'
|
|
275
|
-
ORDER BY
|
|
276
|
-
p.proname
|
|
264
|
+
const result = await dataSource.query(`
|
|
265
|
+
SELECT
|
|
266
|
+
p.proname as name,
|
|
267
|
+
pg_get_userbyid(p.proowner).usename as owner,
|
|
268
|
+
pg_get_functiondef(p.oid) as definition
|
|
269
|
+
FROM
|
|
270
|
+
pg_proc p
|
|
271
|
+
JOIN pg_namespace n ON n.oid = p.pronamespace
|
|
272
|
+
WHERE
|
|
273
|
+
n.nspname = $1
|
|
274
|
+
AND p.prokind = 'f'
|
|
275
|
+
ORDER BY
|
|
276
|
+
p.proname
|
|
277
277
|
`, [database]);
|
|
278
278
|
return result.map((row) => ({
|
|
279
279
|
name: row.name,
|
|
@@ -285,15 +285,15 @@ class CockroachDBService extends base_service_1.BaseDatabaseService {
|
|
|
285
285
|
* 获取CockroachDB存储过程定义
|
|
286
286
|
*/
|
|
287
287
|
async getProcedureDefinition(dataSource, database, procedureName) {
|
|
288
|
-
const result = await dataSource.query(`
|
|
289
|
-
SELECT
|
|
290
|
-
pg_get_functiondef(p.oid) as definition
|
|
291
|
-
FROM
|
|
292
|
-
pg_proc p
|
|
293
|
-
JOIN pg_namespace n ON n.oid = p.pronamespace
|
|
294
|
-
WHERE
|
|
295
|
-
n.nspname = $1
|
|
296
|
-
AND p.proname = $2
|
|
288
|
+
const result = await dataSource.query(`
|
|
289
|
+
SELECT
|
|
290
|
+
pg_get_functiondef(p.oid) as definition
|
|
291
|
+
FROM
|
|
292
|
+
pg_proc p
|
|
293
|
+
JOIN pg_namespace n ON n.oid = p.pronamespace
|
|
294
|
+
WHERE
|
|
295
|
+
n.nspname = $1
|
|
296
|
+
AND p.proname = $2
|
|
297
297
|
`, [database, procedureName]);
|
|
298
298
|
return result[0]?.definition || '';
|
|
299
299
|
}
|
|
@@ -361,18 +361,18 @@ class CockroachDBService extends base_service_1.BaseDatabaseService {
|
|
|
361
361
|
*/
|
|
362
362
|
async viewLogs(dataSource, database, limit = 100) {
|
|
363
363
|
try {
|
|
364
|
-
const result = await dataSource.query(`
|
|
365
|
-
SELECT
|
|
366
|
-
log_time,
|
|
367
|
-
user_name,
|
|
368
|
-
database_name,
|
|
369
|
-
error_severity,
|
|
370
|
-
message
|
|
371
|
-
FROM
|
|
372
|
-
crdb_internal.statement_statistics
|
|
373
|
-
ORDER BY
|
|
374
|
-
log_time DESC
|
|
375
|
-
LIMIT $1
|
|
364
|
+
const result = await dataSource.query(`
|
|
365
|
+
SELECT
|
|
366
|
+
log_time,
|
|
367
|
+
user_name,
|
|
368
|
+
database_name,
|
|
369
|
+
error_severity,
|
|
370
|
+
message
|
|
371
|
+
FROM
|
|
372
|
+
crdb_internal.statement_statistics
|
|
373
|
+
ORDER BY
|
|
374
|
+
log_time DESC
|
|
375
|
+
LIMIT $1
|
|
376
376
|
`, [limit]);
|
|
377
377
|
return result;
|
|
378
378
|
}
|
|
@@ -48,12 +48,12 @@ class SQLServerService extends base_service_1.BaseDatabaseService {
|
|
|
48
48
|
* 获取SQL Server数据库列表
|
|
49
49
|
*/
|
|
50
50
|
async getDatabases(dataSource) {
|
|
51
|
-
const result = await dataSource.query(`
|
|
52
|
-
SELECT name
|
|
53
|
-
FROM sys.databases
|
|
54
|
-
WHERE name NOT IN ('master', 'tempdb', 'model', 'msdb')
|
|
55
|
-
AND state = 0
|
|
56
|
-
ORDER BY name
|
|
51
|
+
const result = await dataSource.query(`
|
|
52
|
+
SELECT name
|
|
53
|
+
FROM sys.databases
|
|
54
|
+
WHERE name NOT IN ('master', 'tempdb', 'model', 'msdb')
|
|
55
|
+
AND state = 0
|
|
56
|
+
ORDER BY name
|
|
57
57
|
`);
|
|
58
58
|
return result.map((row) => row.name);
|
|
59
59
|
}
|
|
@@ -61,19 +61,19 @@ class SQLServerService extends base_service_1.BaseDatabaseService {
|
|
|
61
61
|
* 获取SQL Server表列表
|
|
62
62
|
*/
|
|
63
63
|
async getTables(dataSource, database) {
|
|
64
|
-
const result = await dataSource.query(`
|
|
65
|
-
SELECT
|
|
66
|
-
t.name,
|
|
67
|
-
'BASE TABLE' as type,
|
|
68
|
-
p.rows as rowCount,
|
|
69
|
-
SUM(a.total_pages) * 8 * 1024 as dataSize
|
|
70
|
-
FROM ${this.quoteIdentifier(database)}.sys.tables t
|
|
71
|
-
INNER JOIN ${this.quoteIdentifier(database)}.sys.partitions p ON t.object_id = p.object_id
|
|
72
|
-
INNER JOIN ${this.quoteIdentifier(database)}.sys.allocation_units a ON p.partition_id = a.container_id
|
|
73
|
-
WHERE t.is_ms_shipped = 0
|
|
74
|
-
AND p.index_id IN (0, 1)
|
|
75
|
-
GROUP BY t.name, p.rows
|
|
76
|
-
ORDER BY t.name
|
|
64
|
+
const result = await dataSource.query(`
|
|
65
|
+
SELECT
|
|
66
|
+
t.name,
|
|
67
|
+
'BASE TABLE' as type,
|
|
68
|
+
p.rows as rowCount,
|
|
69
|
+
SUM(a.total_pages) * 8 * 1024 as dataSize
|
|
70
|
+
FROM ${this.quoteIdentifier(database)}.sys.tables t
|
|
71
|
+
INNER JOIN ${this.quoteIdentifier(database)}.sys.partitions p ON t.object_id = p.object_id
|
|
72
|
+
INNER JOIN ${this.quoteIdentifier(database)}.sys.allocation_units a ON p.partition_id = a.container_id
|
|
73
|
+
WHERE t.is_ms_shipped = 0
|
|
74
|
+
AND p.index_id IN (0, 1)
|
|
75
|
+
GROUP BY t.name, p.rows
|
|
76
|
+
ORDER BY t.name
|
|
77
77
|
`);
|
|
78
78
|
return result.map((row) => ({
|
|
79
79
|
name: row.name,
|
|
@@ -88,20 +88,20 @@ class SQLServerService extends base_service_1.BaseDatabaseService {
|
|
|
88
88
|
*/
|
|
89
89
|
async getColumns(dataSource, database, table) {
|
|
90
90
|
// 使用兼容的SQL查询,避免使用可能不兼容的函数
|
|
91
|
-
const result = await dataSource.query(`
|
|
92
|
-
SELECT
|
|
93
|
-
c.name,
|
|
94
|
-
t.name as type,
|
|
95
|
-
c.max_length as length,
|
|
96
|
-
c.precision,
|
|
97
|
-
c.scale,
|
|
98
|
-
c.is_nullable as nullable,
|
|
99
|
-
c.default_object_id,
|
|
100
|
-
COLUMNPROPERTY(c.object_id, c.name, 'IsIdentity') as isIdentity
|
|
101
|
-
FROM ${this.quoteIdentifier(database)}.sys.columns c
|
|
102
|
-
INNER JOIN ${this.quoteIdentifier(database)}.sys.types t ON c.user_type_id = t.user_type_id
|
|
103
|
-
WHERE c.object_id = OBJECT_ID(?)
|
|
104
|
-
ORDER BY c.column_id
|
|
91
|
+
const result = await dataSource.query(`
|
|
92
|
+
SELECT
|
|
93
|
+
c.name,
|
|
94
|
+
t.name as type,
|
|
95
|
+
c.max_length as length,
|
|
96
|
+
c.precision,
|
|
97
|
+
c.scale,
|
|
98
|
+
c.is_nullable as nullable,
|
|
99
|
+
c.default_object_id,
|
|
100
|
+
COLUMNPROPERTY(c.object_id, c.name, 'IsIdentity') as isIdentity
|
|
101
|
+
FROM ${this.quoteIdentifier(database)}.sys.columns c
|
|
102
|
+
INNER JOIN ${this.quoteIdentifier(database)}.sys.types t ON c.user_type_id = t.user_type_id
|
|
103
|
+
WHERE c.object_id = OBJECT_ID(?)
|
|
104
|
+
ORDER BY c.column_id
|
|
105
105
|
`, [`${database}.${table}`]);
|
|
106
106
|
// 获取主键信息
|
|
107
107
|
const primaryKeys = await this.getPrimaryKeys(dataSource, database, table);
|
|
@@ -121,18 +121,18 @@ class SQLServerService extends base_service_1.BaseDatabaseService {
|
|
|
121
121
|
* 获取SQL Server索引信息
|
|
122
122
|
*/
|
|
123
123
|
async getIndexes(dataSource, database, table) {
|
|
124
|
-
const result = await dataSource.query(`
|
|
125
|
-
SELECT
|
|
126
|
-
i.name,
|
|
127
|
-
i.type_desc as type,
|
|
128
|
-
c.name as column,
|
|
129
|
-
i.is_unique as isUnique
|
|
130
|
-
FROM ${this.quoteIdentifier(database)}.sys.indexes i
|
|
131
|
-
INNER JOIN ${this.quoteIdentifier(database)}.sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
|
|
132
|
-
INNER JOIN ${this.quoteIdentifier(database)}.sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id
|
|
133
|
-
WHERE i.object_id = OBJECT_ID(?)
|
|
134
|
-
AND i.is_primary_key = 0
|
|
135
|
-
ORDER BY i.name, ic.key_ordinal
|
|
124
|
+
const result = await dataSource.query(`
|
|
125
|
+
SELECT
|
|
126
|
+
i.name,
|
|
127
|
+
i.type_desc as type,
|
|
128
|
+
c.name as column,
|
|
129
|
+
i.is_unique as isUnique
|
|
130
|
+
FROM ${this.quoteIdentifier(database)}.sys.indexes i
|
|
131
|
+
INNER JOIN ${this.quoteIdentifier(database)}.sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id
|
|
132
|
+
INNER JOIN ${this.quoteIdentifier(database)}.sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id
|
|
133
|
+
WHERE i.object_id = OBJECT_ID(?)
|
|
134
|
+
AND i.is_primary_key = 0
|
|
135
|
+
ORDER BY i.name, ic.key_ordinal
|
|
136
136
|
`, [`${database}.${table}`]);
|
|
137
137
|
// 按索引名分组
|
|
138
138
|
const indexMap = new Map();
|
|
@@ -153,20 +153,20 @@ class SQLServerService extends base_service_1.BaseDatabaseService {
|
|
|
153
153
|
* 获取SQL Server外键信息
|
|
154
154
|
*/
|
|
155
155
|
async getForeignKeys(dataSource, database, table) {
|
|
156
|
-
const result = await dataSource.query(`
|
|
157
|
-
SELECT
|
|
158
|
-
fk.name as name,
|
|
159
|
-
c.name as column,
|
|
160
|
-
rt.name as referencedTable,
|
|
161
|
-
rc.name as referencedColumn,
|
|
162
|
-
fk.delete_action_desc as onDelete,
|
|
163
|
-
fk.update_action_desc as onUpdate
|
|
164
|
-
FROM ${this.quoteIdentifier(database)}.sys.foreign_keys fk
|
|
165
|
-
INNER JOIN ${this.quoteIdentifier(database)}.sys.foreign_key_columns fkc ON fk.object_id = fkc.constraint_object_id
|
|
166
|
-
INNER JOIN ${this.quoteIdentifier(database)}.sys.columns c ON fkc.parent_object_id = c.object_id AND fkc.parent_column_id = c.column_id
|
|
167
|
-
INNER JOIN ${this.quoteIdentifier(database)}.sys.columns rc ON fkc.referenced_object_id = rc.object_id AND fkc.referenced_column_id = rc.column_id
|
|
168
|
-
INNER JOIN ${this.quoteIdentifier(database)}.sys.tables rt ON fkc.referenced_object_id = rt.object_id
|
|
169
|
-
WHERE fkc.parent_object_id = OBJECT_ID(?)
|
|
156
|
+
const result = await dataSource.query(`
|
|
157
|
+
SELECT
|
|
158
|
+
fk.name as name,
|
|
159
|
+
c.name as column,
|
|
160
|
+
rt.name as referencedTable,
|
|
161
|
+
rc.name as referencedColumn,
|
|
162
|
+
fk.delete_action_desc as onDelete,
|
|
163
|
+
fk.update_action_desc as onUpdate
|
|
164
|
+
FROM ${this.quoteIdentifier(database)}.sys.foreign_keys fk
|
|
165
|
+
INNER JOIN ${this.quoteIdentifier(database)}.sys.foreign_key_columns fkc ON fk.object_id = fkc.constraint_object_id
|
|
166
|
+
INNER JOIN ${this.quoteIdentifier(database)}.sys.columns c ON fkc.parent_object_id = c.object_id AND fkc.parent_column_id = c.column_id
|
|
167
|
+
INNER JOIN ${this.quoteIdentifier(database)}.sys.columns rc ON fkc.referenced_object_id = rc.object_id AND fkc.referenced_column_id = rc.column_id
|
|
168
|
+
INNER JOIN ${this.quoteIdentifier(database)}.sys.tables rt ON fkc.referenced_object_id = rt.object_id
|
|
169
|
+
WHERE fkc.parent_object_id = OBJECT_ID(?)
|
|
170
170
|
`, [`${database}.${table}`]);
|
|
171
171
|
return result.map((row) => ({
|
|
172
172
|
name: row.name,
|
|
@@ -181,10 +181,10 @@ class SQLServerService extends base_service_1.BaseDatabaseService {
|
|
|
181
181
|
* 获取SQL Server数据库大小
|
|
182
182
|
*/
|
|
183
183
|
async getDatabaseSize(dataSource, database) {
|
|
184
|
-
const result = await dataSource.query(`
|
|
185
|
-
SELECT SUM(size * 8 * 1024) as size
|
|
186
|
-
FROM sys.master_files
|
|
187
|
-
WHERE database_id = DB_ID(?)
|
|
184
|
+
const result = await dataSource.query(`
|
|
185
|
+
SELECT SUM(size * 8 * 1024) as size
|
|
186
|
+
FROM sys.master_files
|
|
187
|
+
WHERE database_id = DB_ID(?)
|
|
188
188
|
`, [database]);
|
|
189
189
|
return result[0]?.size || 0;
|
|
190
190
|
}
|
|
@@ -192,14 +192,14 @@ class SQLServerService extends base_service_1.BaseDatabaseService {
|
|
|
192
192
|
* 获取主键信息
|
|
193
193
|
*/
|
|
194
194
|
async getPrimaryKeys(dataSource, database, table) {
|
|
195
|
-
const result = await dataSource.query(`
|
|
196
|
-
SELECT c.name
|
|
197
|
-
FROM ${this.quoteIdentifier(database)}.sys.key_constraints k
|
|
198
|
-
INNER JOIN ${this.quoteIdentifier(database)}.sys.index_columns ic ON k.parent_object_id = ic.object_id AND k.unique_index_id = ic.index_id
|
|
199
|
-
INNER JOIN ${this.quoteIdentifier(database)}.sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id
|
|
200
|
-
WHERE k.type = 'PK'
|
|
201
|
-
AND k.parent_object_id = OBJECT_ID(?)
|
|
202
|
-
ORDER BY ic.key_ordinal
|
|
195
|
+
const result = await dataSource.query(`
|
|
196
|
+
SELECT c.name
|
|
197
|
+
FROM ${this.quoteIdentifier(database)}.sys.key_constraints k
|
|
198
|
+
INNER JOIN ${this.quoteIdentifier(database)}.sys.index_columns ic ON k.parent_object_id = ic.object_id AND k.unique_index_id = ic.index_id
|
|
199
|
+
INNER JOIN ${this.quoteIdentifier(database)}.sys.columns c ON ic.object_id = c.object_id AND ic.column_id = c.column_id
|
|
200
|
+
WHERE k.type = 'PK'
|
|
201
|
+
AND k.parent_object_id = OBJECT_ID(?)
|
|
202
|
+
ORDER BY ic.key_ordinal
|
|
203
203
|
`, [`${database}.${table}`]);
|
|
204
204
|
return result.map((row) => row.name);
|
|
205
205
|
}
|
|
@@ -213,13 +213,13 @@ class SQLServerService extends base_service_1.BaseDatabaseService {
|
|
|
213
213
|
* 获取SQL Server视图列表
|
|
214
214
|
*/
|
|
215
215
|
async getViews(dataSource, database) {
|
|
216
|
-
const result = await dataSource.query(`
|
|
217
|
-
SELECT
|
|
218
|
-
TABLE_NAME as name,
|
|
219
|
-
'' as comment,
|
|
220
|
-
TABLE_SCHEMA as schemaName
|
|
221
|
-
FROM ${this.quoteIdentifier(database)}.INFORMATION_SCHEMA.VIEWS
|
|
222
|
-
ORDER BY TABLE_NAME
|
|
216
|
+
const result = await dataSource.query(`
|
|
217
|
+
SELECT
|
|
218
|
+
TABLE_NAME as name,
|
|
219
|
+
'' as comment,
|
|
220
|
+
TABLE_SCHEMA as schemaName
|
|
221
|
+
FROM ${this.quoteIdentifier(database)}.INFORMATION_SCHEMA.VIEWS
|
|
222
|
+
ORDER BY TABLE_NAME
|
|
223
223
|
`);
|
|
224
224
|
return result.map((row) => ({
|
|
225
225
|
name: row.name,
|
|
@@ -231,10 +231,10 @@ class SQLServerService extends base_service_1.BaseDatabaseService {
|
|
|
231
231
|
* 获取SQL Server视图定义
|
|
232
232
|
*/
|
|
233
233
|
async getViewDefinition(dataSource, database, viewName) {
|
|
234
|
-
const result = await dataSource.query(`
|
|
235
|
-
SELECT VIEW_DEFINITION as definition
|
|
236
|
-
FROM ${this.quoteIdentifier(database)}.INFORMATION_SCHEMA.VIEWS
|
|
237
|
-
WHERE TABLE_NAME = ?
|
|
234
|
+
const result = await dataSource.query(`
|
|
235
|
+
SELECT VIEW_DEFINITION as definition
|
|
236
|
+
FROM ${this.quoteIdentifier(database)}.INFORMATION_SCHEMA.VIEWS
|
|
237
|
+
WHERE TABLE_NAME = ?
|
|
238
238
|
`, [viewName]);
|
|
239
239
|
return result[0]?.definition || '';
|
|
240
240
|
}
|
|
@@ -242,16 +242,16 @@ class SQLServerService extends base_service_1.BaseDatabaseService {
|
|
|
242
242
|
* 获取SQL Server存储过程列表
|
|
243
243
|
*/
|
|
244
244
|
async getProcedures(dataSource, database) {
|
|
245
|
-
const result = await dataSource.query(`
|
|
246
|
-
SELECT
|
|
247
|
-
ROUTINE_NAME as name,
|
|
248
|
-
'' as comment,
|
|
249
|
-
ROUTINE_TYPE as type,
|
|
250
|
-
'' as returnType,
|
|
251
|
-
'SQL' as language
|
|
252
|
-
FROM ${this.quoteIdentifier(database)}.INFORMATION_SCHEMA.ROUTINES
|
|
253
|
-
WHERE ROUTINE_SCHEMA NOT IN ('sys', 'INFORMATION_SCHEMA')
|
|
254
|
-
ORDER BY ROUTINE_NAME
|
|
245
|
+
const result = await dataSource.query(`
|
|
246
|
+
SELECT
|
|
247
|
+
ROUTINE_NAME as name,
|
|
248
|
+
'' as comment,
|
|
249
|
+
ROUTINE_TYPE as type,
|
|
250
|
+
'' as returnType,
|
|
251
|
+
'SQL' as language
|
|
252
|
+
FROM ${this.quoteIdentifier(database)}.INFORMATION_SCHEMA.ROUTINES
|
|
253
|
+
WHERE ROUTINE_SCHEMA NOT IN ('sys', 'INFORMATION_SCHEMA')
|
|
254
|
+
ORDER BY ROUTINE_NAME
|
|
255
255
|
`);
|
|
256
256
|
return result.map((row) => ({
|
|
257
257
|
name: row.name,
|
|
@@ -265,10 +265,10 @@ class SQLServerService extends base_service_1.BaseDatabaseService {
|
|
|
265
265
|
* 获取SQL Server存储过程定义
|
|
266
266
|
*/
|
|
267
267
|
async getProcedureDefinition(dataSource, database, procedureName) {
|
|
268
|
-
const result = await dataSource.query(`
|
|
269
|
-
SELECT ROUTINE_DEFINITION as definition
|
|
270
|
-
FROM ${this.quoteIdentifier(database)}.INFORMATION_SCHEMA.ROUTINES
|
|
271
|
-
WHERE ROUTINE_NAME = ?
|
|
268
|
+
const result = await dataSource.query(`
|
|
269
|
+
SELECT ROUTINE_DEFINITION as definition
|
|
270
|
+
FROM ${this.quoteIdentifier(database)}.INFORMATION_SCHEMA.ROUTINES
|
|
271
|
+
WHERE ROUTINE_NAME = ?
|
|
272
272
|
`, [procedureName]);
|
|
273
273
|
return result[0]?.definition || '';
|
|
274
274
|
}
|