feat: add firebird triggers

This commit is contained in:
Nybkox
2025-05-07 00:29:42 +02:00
parent 3e2840ca15
commit 3fd3de1828
4 changed files with 58 additions and 1 deletions

View File

@@ -1,6 +1,6 @@
const _ = require('lodash');
const sql = require('./sql');
const { getDataTypeString } = require('./helpers');
const { getDataTypeString, getTriggerTiming, getTriggerEventType } = require('./helpers');
const { DatabaseAnalyser } = require('dbgate-tools');
@@ -12,6 +12,7 @@ class Analyser extends DatabaseAnalyser {
async _runAnalysis() {
const tablesResult = await this.driver.query(this.dbhan, sql.tables);
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 => ({
tableName: i.TABLENAME,
@@ -28,6 +29,7 @@ class Analyser extends DatabaseAnalyser {
pureName: i.PURENAME,
schemaName: i.SCHEMANAME,
}));
const tables = tablesResult.rows.map(i => ({
pureName: i.PURENAME,
objectId: i.OBJECTID,
@@ -35,6 +37,14 @@ class Analyser extends DatabaseAnalyser {
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 {
tables: tables.map(table => ({
...table,
@@ -42,6 +52,7 @@ class Analyser extends DatabaseAnalyser {
column => column.tableName === table.pureName && column.schemaName === table.schemaName
),
})),
triggers,
};
}

View File

@@ -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 = {
getDataTypeString,
getTriggerEventType,
getTriggerTiming,
};

View File

@@ -1,9 +1,11 @@
const version = require('./version');
const tables = require('./tables');
const columns = require('./columns');
const triggers = require('./triggers');
module.exports = {
version,
columns,
tables,
triggers,
};

View 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
`;