Merge pull request #969 from dbgate/feature/triggers

Feature/triggers
This commit is contained in:
Jan Prochazka
2024-12-19 12:09:08 +01:00
committed by GitHub
22 changed files with 402 additions and 48 deletions

View File

@@ -114,13 +114,19 @@ class Analyser extends DatabaseAnalyser {
// if (!cntBase || !cntRef) continue;
const baseCols = _.sortBy(
fk_keyColumnUsage.rows.filter(
x => x.table_name == fkRef.table_name && x.constraint_name == fkRef.constraint_name && x.table_schema == fkRef.table_schema
x =>
x.table_name == fkRef.table_name &&
x.constraint_name == fkRef.constraint_name &&
x.table_schema == fkRef.table_schema
),
'ordinal_position'
);
const refCols = _.sortBy(
fk_keyColumnUsage.rows.filter(
x => x.table_name == fkRef.ref_table_name && x.constraint_name == fkRef.unique_constraint_name && x.table_schema == fkRef.ref_table_schema
x =>
x.table_name == fkRef.ref_table_name &&
x.constraint_name == fkRef.unique_constraint_name &&
x.table_schema == fkRef.ref_table_schema
),
'ordinal_position'
);
@@ -185,6 +191,9 @@ class Analyser extends DatabaseAnalyser {
geographyColumns = await this.analyserQuery('geographyColumns', ['tables']);
}
this.feedback({ analysingMessage: 'Loading triggers' });
const triggers = await this.analyserQuery('triggers');
this.feedback({ analysingMessage: 'Finalizing DB structure' });
const columnColumnsMapped = fkColumns.rows.map(x => ({
@@ -348,6 +357,19 @@ class Analyser extends DatabaseAnalyser {
parameters: functionNameToParameters[`${func.schema_name}.${func.pure_name}`],
returnType: func.data_type,
})),
triggers: triggers.rows.map(row => ({
pureName: row.trigger_name,
trigerName: row.trigger_name,
functionName: row.function_name,
triggerTiming: row.trigger_timing,
triggerLevel: row.trigger_level,
eventType: row.event_type,
schemaName: row.schema_name,
tableName: row.table_name,
createSql: row.definition,
contentHash: `triggers:${row.trigger_id}`,
objectId: `triggers:${row.trigger_id}`,
})),
};
this.feedback({ analysingMessage: null });

View File

@@ -16,6 +16,8 @@ const geometryColumns = require('./geometryColumns');
const geographyColumns = require('./geographyColumns');
const proceduresParameters = require('./proceduresParameters');
const foreignKeys = require('./foreignKeys');
const triggers = require('./triggers');
const fk_keyColumnUsage = require('./fk_key_column_usage');
module.exports = {
@@ -38,4 +40,5 @@ module.exports = {
geometryColumns,
geographyColumns,
proceduresParameters,
triggers,
};

View File

@@ -0,0 +1,35 @@
module.exports = `
SELECT
t.oid AS trigger_id,
t.tgname AS trigger_name,
n.nspname AS schema_name,
c.relname AS table_name,
p.proname AS function_name,
t.tgtype AS original_tgtype,
CASE
WHEN t.tgtype & 1 = 1 THEN 'ROW'
ELSE 'STATEMENT'
END AS trigger_level,
COALESCE(
CASE WHEN (tgtype::int::bit(7) & b'0000010')::int = 0 THEN NULL ELSE 'BEFORE' END,
CASE WHEN (tgtype::int::bit(7) & b'0000010')::int = 0 THEN 'AFTER' ELSE NULL END,
CASE WHEN (tgtype::int::bit(7) & b'1000000')::int = 0 THEN NULL ELSE 'INSTEAD OF' END,
''
)::text as trigger_timing,
(CASE WHEN (tgtype::int::bit(7) & b'0000100')::int = 0 THEN '' ELSE 'INSERT' END) ||
(CASE WHEN (tgtype::int::bit(7) & b'0001000')::int = 0 THEN '' ELSE 'DELETE' END) ||
(CASE WHEN (tgtype::int::bit(7) & b'0010000')::int = 0 THEN '' ELSE 'UPDATE' END) ||
(CASE WHEN (tgtype::int::bit(7) & b'0100000')::int = 0 THEN '' ELSE 'TRUNCATE' END)
as event_type,
pg_get_triggerdef(t.oid) AS definition
FROM
pg_trigger t
JOIN
pg_class c ON c.oid = t.tgrelid
JOIN
pg_namespace n ON n.oid = c.relnamespace
JOIN
pg_proc p ON p.oid = t.tgfoid
WHERE
NOT t.tgisinternal AND n.nspname =SCHEMA_NAME_CONDITION
`;