mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-25 12:06:00 +00:00
feat: add firebird triggers
This commit is contained in:
@@ -1,6 +1,6 @@
|
|||||||
const _ = require('lodash');
|
const _ = require('lodash');
|
||||||
const sql = require('./sql');
|
const sql = require('./sql');
|
||||||
const { getDataTypeString } = require('./helpers');
|
const { getDataTypeString, getTriggerTiming, getTriggerEventType } = require('./helpers');
|
||||||
|
|
||||||
const { DatabaseAnalyser } = require('dbgate-tools');
|
const { DatabaseAnalyser } = require('dbgate-tools');
|
||||||
|
|
||||||
@@ -12,6 +12,7 @@ class Analyser extends DatabaseAnalyser {
|
|||||||
async _runAnalysis() {
|
async _runAnalysis() {
|
||||||
const tablesResult = await this.driver.query(this.dbhan, sql.tables);
|
const tablesResult = await this.driver.query(this.dbhan, sql.tables);
|
||||||
const columnsResult = await this.driver.query(this.dbhan, sql.columns);
|
const columnsResult = await this.driver.query(this.dbhan, sql.columns);
|
||||||
|
const triggersResult = await this.driver.query(this.dbhan, sql.triggers);
|
||||||
|
|
||||||
const columns = columnsResult.rows.map(i => ({
|
const columns = columnsResult.rows.map(i => ({
|
||||||
tableName: i.TABLENAME,
|
tableName: i.TABLENAME,
|
||||||
@@ -28,6 +29,7 @@ class Analyser extends DatabaseAnalyser {
|
|||||||
pureName: i.PURENAME,
|
pureName: i.PURENAME,
|
||||||
schemaName: i.SCHEMANAME,
|
schemaName: i.SCHEMANAME,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
const tables = tablesResult.rows.map(i => ({
|
const tables = tablesResult.rows.map(i => ({
|
||||||
pureName: i.PURENAME,
|
pureName: i.PURENAME,
|
||||||
objectId: i.OBJECTID,
|
objectId: i.OBJECTID,
|
||||||
@@ -35,6 +37,14 @@ class Analyser extends DatabaseAnalyser {
|
|||||||
objectComment: i.OBJECTCOMMENT,
|
objectComment: i.OBJECTCOMMENT,
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
const triggers = triggersResult.rows.map(i => ({
|
||||||
|
pureName: i.PURENAME,
|
||||||
|
tableName: i.TABLENAME,
|
||||||
|
shcemaName: i.SCHEMANAME,
|
||||||
|
eventType: getTriggerEventType(i.TRIGGERTYPE),
|
||||||
|
triggerTiming: getTriggerTiming(i.TRIGGERTYPE),
|
||||||
|
}));
|
||||||
|
|
||||||
return {
|
return {
|
||||||
tables: tables.map(table => ({
|
tables: tables.map(table => ({
|
||||||
...table,
|
...table,
|
||||||
@@ -42,6 +52,7 @@ class Analyser extends DatabaseAnalyser {
|
|||||||
column => column.tableName === table.pureName && column.schemaName === table.schemaName
|
column => column.tableName === table.pureName && column.schemaName === table.schemaName
|
||||||
),
|
),
|
||||||
})),
|
})),
|
||||||
|
triggers,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -49,6 +49,38 @@ function getDataTypeString(column) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const eventMap = {
|
||||||
|
1: { triggerTiming: 'BEFORE', eventType: 'INSERT' },
|
||||||
|
2: { triggerTiming: 'AFTER', eventType: 'INSERT' },
|
||||||
|
3: { triggerTiming: 'BEFORE', eventType: 'UPDATE' },
|
||||||
|
4: { triggerTiming: 'AFTER', eventType: 'UPDATE' },
|
||||||
|
5: { triggerTiming: 'BEFORE', eventType: 'DELETE' },
|
||||||
|
6: { triggerTiming: 'AFTER', eventType: 'DELETE' },
|
||||||
|
17: { triggerTiming: 'BEFORE', eventType: 'INSERT' }, // OR UPDATE
|
||||||
|
18: { triggerTiming: 'AFTER', eventType: 'INSERT' }, // OR UPDATE
|
||||||
|
25: { triggerTiming: 'BEFORE', eventType: 'INSERT' }, // OR DELETE
|
||||||
|
26: { triggerTiming: 'AFTER', eventType: 'INSERT' }, // OR DELETE
|
||||||
|
27: { triggerTiming: 'BEFORE', eventType: 'UPDATE' }, // OR DELETE
|
||||||
|
28: { triggerTiming: 'AFTER', eventType: 'UPDATE' }, // OR DELETE
|
||||||
|
113: { triggerTiming: 'BEFORE', eventType: 'INSERT' }, // OR UPDATE OR DELETE
|
||||||
|
114: { triggerTiming: 'AFTER', eventType: 'INSERT' }, // OR UPDATE OR DELETE
|
||||||
|
8192: { triggerTiming: 'BEFORE EVENT', eventType: null }, // ON CONNECT
|
||||||
|
8193: { triggerTiming: 'AFTER EVENT', eventType: null }, // ON DISCONNECT
|
||||||
|
8194: { triggerTiming: 'BEFORE STATEMENT', eventType: null }, // ON TRANSACTION START
|
||||||
|
8195: { triggerTiming: 'AFTER STATEMENT', eventType: null }, // ON TRANSACTION COMMIT
|
||||||
|
8196: { triggerTiming: 'AFTER STATEMENT', eventType: null }, // ON TRANSACTION ROLLBACK
|
||||||
|
};
|
||||||
|
|
||||||
|
function getTriggerEventType(triggerType) {
|
||||||
|
return eventMap[triggerType]?.eventType || null;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getTriggerTiming(triggerType) {
|
||||||
|
return eventMap[triggerType]?.triggerTiming || null;
|
||||||
|
}
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
getDataTypeString,
|
getDataTypeString,
|
||||||
|
getTriggerEventType,
|
||||||
|
getTriggerTiming,
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,9 +1,11 @@
|
|||||||
const version = require('./version');
|
const version = require('./version');
|
||||||
const tables = require('./tables');
|
const tables = require('./tables');
|
||||||
const columns = require('./columns');
|
const columns = require('./columns');
|
||||||
|
const triggers = require('./triggers');
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
version,
|
version,
|
||||||
columns,
|
columns,
|
||||||
tables,
|
tables,
|
||||||
|
triggers,
|
||||||
};
|
};
|
||||||
|
|||||||
12
plugins/dbgate-plugin-firebird/src/backend/sql/triggers.js
Normal file
12
plugins/dbgate-plugin-firebird/src/backend/sql/triggers.js
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
module.exports = `
|
||||||
|
SELECT
|
||||||
|
TRIM(rtr.RDB$TRIGGER_NAME) as PURENAME,
|
||||||
|
TRIM(rtr.RDB$RELATION_NAME) as TABLENAME,
|
||||||
|
rtr.RDB$TRIGGER_TYPE as TRIGGERTYPE,
|
||||||
|
TRIM(rel.RDB$OWNER_NAME) AS SCHEMANAME
|
||||||
|
FROM
|
||||||
|
RDB$TRIGGERS rtr
|
||||||
|
JOIN RDB$RELATIONS rel ON rtr.RDB$RELATION_NAME = rel.RDB$RELATION_NAME
|
||||||
|
WHERE rtr.RDB$SYSTEM_FLAG = 0
|
||||||
|
ORDER BY rtr.RDB$TRIGGER_NAME
|
||||||
|
`;
|
||||||
Reference in New Issue
Block a user