mirror of
https://github.com/DeNNiiInc/dbgate.git
synced 2026-04-17 23:45:59 +00:00
@@ -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 });
|
||||
|
||||
@@ -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,
|
||||
};
|
||||
|
||||
35
plugins/dbgate-plugin-postgres/src/backend/sql/triggers.js
Normal file
35
plugins/dbgate-plugin-postgres/src/backend/sql/triggers.js
Normal 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
|
||||
`;
|
||||
Reference in New Issue
Block a user