!107 feat:支持修改表名、注释,oracle bug修复

* fix:修复oracle查询数据参数超过1000错误 ORA-01795
* feat:支持右键重命名表
* feat:支持修改表名、表注释
This commit is contained in:
zongyangleo
2024-03-04 11:32:04 +00:00
committed by Coder慌
parent 49d3f988c9
commit 008d34c453
10 changed files with 187 additions and 9 deletions

View File

@@ -168,7 +168,7 @@
<script lang="ts" setup>
import { defineAsyncComponent, h, onBeforeUnmount, onMounted, reactive, ref, toRefs } from 'vue';
import { ElCheckbox, ElMessage, ElMessageBox } from 'element-plus';
import { ElCheckbox, ElInput, ElMessage, ElMessageBox } from 'element-plus';
import { formatByteSize } from '@/common/utils/format';
import { DbInst, registerDbCompletionItemProvider, TabInfo, TabType } from './db';
import { NodeType, TagTreeNode } from '../component/tag';
@@ -182,6 +182,7 @@ import { sleep } from '@/common/utils/loading';
import { TagResourceTypeEnum } from '@/common/commonEnum';
import { Pane, Splitpanes } from 'splitpanes';
import { useEventListener } from '@vueuse/core';
import SqlExecBox from '@/views/ops/db/component/sqleditor/SqlExecBox';
const DbTableOp = defineAsyncComponent(() => import('./component/table/DbTableOp.vue'));
const DbSqlEditor = defineAsyncComponent(() => import('./component/sqleditor/DbSqlEditor.vue'));
@@ -389,6 +390,7 @@ const NodeTypeSqlMenu = new NodeType(SqlExecNodeType.SqlMenu)
const NodeTypeTable = new NodeType(SqlExecNodeType.Table)
.withContextMenuItems([
new ContextmenuItem('copyTable', '复制表').withIcon('copyDocument').withOnClick((data: any) => onCopyTable(data)),
new ContextmenuItem('renameTable', '重命名').withIcon('edit').withOnClick((data: any) => onRenameTable(data)),
new ContextmenuItem('editTable', '编辑表').withIcon('edit').withOnClick((data: any) => onEditTable(data)),
new ContextmenuItem('delTable', '删除表').withIcon('Delete').withOnClick((data: any) => onDeleteTable(data)),
])
@@ -699,6 +701,48 @@ const onDeleteTable = async (data: any) => {
});
};
const onRenameTable = async (data: any) => {
let { db, id, tableName, parentKey, flowProcdefKey } = data.params;
let tableData = { db, oldTableName: tableName, tableName };
let value = ref(tableName);
// 弹出确认框,并选择是否复制数据
await ElMessageBox({
title: `重命名表【${db}.${tableName}`,
type: 'warning',
message: () =>
h(ElInput, {
modelValue: value.value,
'onUpdate:modelValue': (val: string) => {
value.value = val;
},
}),
callback: (action: string) => {
if (action === 'confirm') {
tableData.tableName = value.value;
let sql = nowDbInst.value.getDialect().getModifyTableInfoSql(tableData);
if (sql) {
SqlExecBox({
sql: sql,
dbId: id as any,
db: db as any,
dbType: nowDbInst.value.getDialect().getInfo().formatSqlDialect,
flowProcdefKey: flowProcdefKey,
runSuccessCallback: () => {
setTimeout(() => {
parentKey && reloadNode(parentKey);
}, 1000);
},
});
} else {
ElMessage.error('无更改');
return;
}
}
},
});
};
const onCopyTable = async (data: any) => {
let { db, id, tableName, parentKey } = data.params;

View File

@@ -262,6 +262,8 @@ const state = reactive({
},
tableName: '',
tableComment: '',
oldTableName: '',
oldTableComment: '',
height: 450,
db: '',
},
@@ -410,6 +412,7 @@ const filterChangedData = (oldArr: object[], nowArr: object[], key: string): { d
const genSql = () => {
let data = state.tableData;
console.log(data);
// 创建表
if (!props.data?.edit) {
let createTable = dbDialect.getCreateTableSql(data);
@@ -424,12 +427,14 @@ const genSql = () => {
let colSql = changeColData.changed ? dbDialect.getModifyColumnSql(data, data.tableName, changeColData) : '';
// 修改索引
let changeIdxData = filterChangedData(state.tableData.indexs.oldIndexs, state.tableData.indexs.res, 'indexName');
let idxSql = changeColData.changed ? dbDialect.getModifyIndexSql(data, data.tableName, changeIdxData) : '';
// 修改表名
let idxSql = changeIdxData.changed ? dbDialect.getModifyIndexSql(data, data.tableName, changeIdxData) : '';
// 修改表名,表注释
let tableInfoSql = data.tableName !== data.oldTableName || data.tableComment !== data.oldTableComment ? dbDialect.getModifyTableInfoSql(data) : '';
let sqlArr = [];
colSql && sqlArr.push(colSql);
idxSql && sqlArr.push(idxSql);
tableInfoSql && sqlArr.push(tableInfoSql);
return sqlArr.join(';');
}
@@ -486,13 +491,18 @@ watch(
// 回显表名表注释
state.tableData.tableName = row.tableName;
state.tableData.tableComment = row.tableComment;
state.tableData.oldTableName = row.tableName;
state.tableData.oldTableComment = row.tableComment;
state.tableData.db = props.db!;
state.tableData.fields.oldFields = [];
state.tableData.fields.res = [];
state.tableData.indexs.oldIndexs = [];
state.tableData.indexs.res = [];
// 索引列下拉选
state.tableData.indexs.columns = [];
// 回显列
if (columns && Array.isArray(columns) && columns.length > 0) {
state.tableData.fields.oldFields = [];
state.tableData.fields.res = [];
// 索引列下拉选
state.tableData.indexs.columns = [];
columns.forEach((a) => {
let typeObj = a.columnType.replace(')', '').split('(');
let type = typeObj[0];
@@ -521,10 +531,9 @@ watch(
state.tableData.indexs.columns.push({ name: a.columnName, remark: a.columnComment });
});
}
// 回显索引
if (indexs && Array.isArray(indexs) && indexs.length > 0) {
state.tableData.indexs.oldIndexs = [];
state.tableData.indexs.res = [];
// 索引过滤掉主键
indexs
.filter((a) => a.indexName !== 'PRIMARY')

View File

@@ -663,6 +663,22 @@ class DMDialect implements DbDialect {
}
return '';
}
getModifyTableInfoSql(tableData: any): string {
let schemaArr = tableData.db.split('/');
let schema = schemaArr.length > 1 ? schemaArr[schemaArr.length - 1] : schemaArr[0];
let sql = '';
if (tableData.oldTableName !== tableData.tableName) {
let baseTable = `${this.quoteIdentifier(schema)}.${this.quoteIdentifier(tableData.oldTableName)}`;
sql += `ALTER TABLE ${baseTable} RENAME TO ${this.quoteIdentifier(tableData.tableName)};`;
}
if (tableData.oldTableComment !== tableData.tableComment) {
let baseTable = `${this.quoteIdentifier(schema)}.${this.quoteIdentifier(tableData.tableName)}`;
sql += `COMMENT ON TABLE ${baseTable} IS '${tableData.tableComment}';`;
}
return sql;
}
getDataType(columnType: string): DataType {
if (DbInst.isNumber(columnType)) {

View File

@@ -222,6 +222,9 @@ export interface DbDialect {
*/
getModifyIndexSql(tableData: any, tableName: string, changeData: { del: any[]; add: any[]; upd: any[] }): string;
/** 生成编辑表信息sql */
getModifyTableInfoSql(tableData: any): string;
/** 通过数据库字段类型,返回基本数据类型 */
getDataType(columnType: string): DataType;

View File

@@ -399,6 +399,37 @@ ELSE
return arr.join(';');
}
getModifyTableInfoSql(tableData: any): string {
let schemaArr = tableData.db.split('/');
let schema = schemaArr.length > 1 ? schemaArr[schemaArr.length - 1] : schemaArr[0];
let sql = '';
if (tableData.oldTableName !== tableData.tableName) {
let baseTable = `${this.quoteIdentifier(schema)}.${this.quoteIdentifier(tableData.oldTableName)}`;
// 查找是否存在注释,存在则修改,不存在则添加
sql += `EXEC sp_rename '${baseTable}', '${tableData.tableName}';`;
}
if (tableData.oldTableComment !== tableData.tableComment) {
// 转义注释中的单引号和换行符
let tableComment = tableData.tableComment.replaceAll(/'/g, '').replaceAll(/[\r\n]/g, ' ');
sql += `IF ((SELECT COUNT(*) FROM fn_listextendedproperty('MS_Description',
'SCHEMA', N'${schema}',
'TABLE', N'${tableData.tableName}', NULL, NULL)) > 0)
EXEC sp_updateextendedproperty
'MS_Description', N'${tableComment}',
'SCHEMA', N'${schema}',
'TABLE', N'${tableData.tableName}'
ELSE
EXEC sp_addextendedproperty
'MS_Description', N'${tableComment}',
'SCHEMA', N'${schema}',
'TABLE', N'${tableData.tableName}'`;
}
return sql;
}
getDataType(columnType: string): DataType {
if (DbInst.isNumber(columnType)) {
return DataType.Number;

View File

@@ -323,6 +323,18 @@ class MysqlDialect implements DbDialect {
return '';
}
getModifyTableInfoSql(tableData: any): string {
let sql = '';
if (tableData.tableComment !== tableData.oldTableComment) {
sql += `ALTER TABLE ${this.quoteIdentifier(tableData.db)}.${this.quoteIdentifier(tableData.oldTableName)} COMMENT '${tableData.tableComment}';`;
}
if (tableData.tableName !== tableData.oldTableName) {
sql += `ALTER TABLE ${this.quoteIdentifier(tableData.db)}.${this.quoteIdentifier(tableData.oldTableName)} RENAME TO ${this.quoteIdentifier(tableData.tableName)};`;
}
return sql;
}
getDataType(columnType: string): DataType {
if (DbInst.isNumber(columnType)) {
return DataType.Number;

View File

@@ -474,6 +474,22 @@ class OracleDialect implements DbDialect {
return '';
}
getModifyTableInfoSql(tableData: any): string {
let schemaArr = tableData.db.split('/');
let schema = schemaArr.length > 1 ? schemaArr[schemaArr.length - 1] : schemaArr[0];
let sql = '';
if (tableData.tableComment != tableData.oldTableComment) {
let dbTable = `${this.quoteIdentifier(schema)}.${this.quoteIdentifier(tableData.oldTableName)}`;
sql = `COMMENT ON TABLE ${dbTable} is '${tableData.tableComment}';`;
}
if (tableData.tableName != tableData.oldTableName) {
let dbTable = `${this.quoteIdentifier(schema)}.${this.quoteIdentifier(tableData.oldTableName)}`;
sql += `ALTER TABLE ${dbTable} RENAME TO ${this.quoteIdentifier(tableData.tableName)}`;
}
return sql;
}
getDataType(columnType: string): DataType {
if (DbInst.isNumber(columnType)) {
return DataType.Number;

View File

@@ -421,6 +421,22 @@ class PostgresqlDialect implements DbDialect {
return '';
}
getModifyTableInfoSql(tableData: any): string {
let schemaArr = tableData.db.split('/');
let schema = schemaArr.length > 1 ? schemaArr[schemaArr.length - 1] : schemaArr[0];
let sql = '';
if (tableData.tableComment != tableData.oldTableComment) {
let dbTable = `${this.quoteIdentifier(schema)}.${this.quoteIdentifier(tableData.oldTableName)}`;
sql = `COMMENT ON TABLE ${dbTable} is '${tableData.tableComment}';`;
}
if (tableData.tableName != tableData.oldTableName) {
let dbTable = `${this.quoteIdentifier(schema)}.${this.quoteIdentifier(tableData.oldTableName)}`;
sql += `ALTER TABLE ${dbTable} RENAME TO ${this.quoteIdentifier(tableData.tableName)}`;
}
return sql;
}
getDataType(columnType: string): DataType {
if (DbInst.isNumber(columnType)) {
return DataType.Number;

View File

@@ -314,6 +314,19 @@ class SqliteDialect implements DbDialect {
return sql.join(';');
}
getModifyTableInfoSql(tableData: any): string {
let schemaArr = tableData.db.split('/');
let schema = schemaArr.length > 1 ? schemaArr[schemaArr.length - 1] : schemaArr[0];
// sqlite没有表注释
let sql = '';
if (tableData.tableName != tableData.oldTableName) {
let dbTable = `${this.quoteIdentifier(schema)}.${this.quoteIdentifier(tableData.oldTableName)}`;
sql += `ALTER TABLE ${dbTable} RENAME TO ${this.quoteIdentifier(tableData.tableName)}`;
}
return sql;
}
getDataType(columnType: string): DataType {
if (DbInst.isNumber(columnType)) {
return DataType.Number;

View File

@@ -86,6 +86,24 @@ func (od *OracleDialect) GetColumns(tableNames ...string) ([]dbi.Column, error)
return fmt.Sprintf("'%s'", dbType.RemoveQuote(val))
}), ",")
// 如果表数量超过了1000需要分批查询
if len(tableNames) > 1000 {
columns := make([]dbi.Column, 0)
for i := 0; i < len(tableNames); i += 1000 {
end := i + 1000
if end > len(tableNames) {
end = len(tableNames)
}
tables := tableNames[i:end]
cols, err := od.GetColumns(tables...)
if err != nil {
return nil, err
}
columns = append(columns, cols...)
}
return columns, nil
}
_, res, err := od.dc.Query(fmt.Sprintf(dbi.GetLocalSql(ORACLE_META_FILE, ORACLE_COLUMN_MA_KEY), tableName))
if err != nil {
return nil, err