mirror of
https://github.com/FirebirdSQL/firebird.git
synced 2025-02-02 10:00:38 +01:00
Added EVENT_TYPE and OBJECT_TYPE to DDL_TRIGGER context. Improvement suggested by Thomas Steinmaurer.
This commit is contained in:
parent
98efcd9a9d
commit
dfe830af7c
@ -110,7 +110,9 @@ DDL_TRIGGER context namespace:
|
||||
stack.
|
||||
|
||||
The context elements are:
|
||||
- DDL_EVENT: event name (<ddl event item>)
|
||||
- EVENT_TYPE: event type (CREATE, ALTER, DROP)
|
||||
- OBJECT_TYPE: object type (TABLE, VIEW etc)
|
||||
- DDL_EVENT: event name (<ddl event item>, which is EVENT_TYPE || ' ' || OBJECT_TYPE)
|
||||
- OBJECT_NAME: metadata object name
|
||||
- SQL_TEXT: sql statement text
|
||||
|
||||
@ -198,6 +200,8 @@ create table ddl_log (
|
||||
id bigint not null primary key,
|
||||
moment timestamp not null,
|
||||
user_name varchar(31) not null,
|
||||
event_type varchar(25) not null,
|
||||
object_type varchar(25) not null,
|
||||
ddl_event varchar(25) not null,
|
||||
object_name varchar(31) not null,
|
||||
sql_text blob sub_type text not null,
|
||||
@ -214,8 +218,11 @@ begin
|
||||
-- didn't run, the log will survive.
|
||||
in autonomous transaction do
|
||||
begin
|
||||
insert into ddl_log (id, moment, user_name, ddl_event, object_name, sql_text, ok)
|
||||
insert into ddl_log (id, moment, user_name, event_type, object_type, ddl_event, object_name,
|
||||
sql_text, ok)
|
||||
values (next value for ddl_seq, current_timestamp, current_user,
|
||||
rdb$get_context('DDL_TRIGGER', 'EVENT_TYPE'),
|
||||
rdb$get_context('DDL_TRIGGER', 'OBJECT_TYPE'),
|
||||
rdb$get_context('DDL_TRIGGER', 'DDL_EVENT'),
|
||||
rdb$get_context('DDL_TRIGGER', 'OBJECT_NAME'),
|
||||
rdb$get_context('DDL_TRIGGER', 'SQL_TEXT'),
|
||||
|
@ -597,7 +597,8 @@ void DdlNode::executeDdlTrigger(thread_db* tdbb, jrd_tra* transaction, DdlTrigge
|
||||
|
||||
fb_assert(action > 0); // first element is NULL
|
||||
DdlTriggerContext context;
|
||||
context.ddlEvent = DDL_TRIGGER_ACTION_NAMES[action];
|
||||
context.eventType = DDL_TRIGGER_ACTION_NAMES[action][0];
|
||||
context.objectType = DDL_TRIGGER_ACTION_NAMES[action][1];
|
||||
context.objectName = objectName;
|
||||
context.sqlText = sqlText;
|
||||
|
||||
|
@ -294,7 +294,10 @@ const string SHOW_trigger_action(SINT64 type)
|
||||
buffer += " ";
|
||||
|
||||
if (pos < FB_NELEM(DDL_TRIGGER_ACTION_NAMES))
|
||||
buffer += DDL_TRIGGER_ACTION_NAMES[pos];
|
||||
{
|
||||
buffer += string(DDL_TRIGGER_ACTION_NAMES[pos][0]) + " " +
|
||||
DDL_TRIGGER_ACTION_NAMES[pos][1];
|
||||
}
|
||||
else
|
||||
buffer += "<unknown>";
|
||||
}
|
||||
|
@ -92,13 +92,15 @@ typedef Firebird::GenericMap<Firebird::Pair<Firebird::Left<
|
||||
struct DdlTriggerContext
|
||||
{
|
||||
DdlTriggerContext()
|
||||
: ddlEvent(*getDefaultMemoryPool()),
|
||||
: eventType(*getDefaultMemoryPool()),
|
||||
objectType(*getDefaultMemoryPool()),
|
||||
objectName(*getDefaultMemoryPool()),
|
||||
sqlText(*getDefaultMemoryPool())
|
||||
{
|
||||
}
|
||||
|
||||
Firebird::string ddlEvent;
|
||||
Firebird::string eventType;
|
||||
Firebird::string objectType;
|
||||
Firebird::MetaName objectName;
|
||||
Firebird::string sqlText;
|
||||
};
|
||||
|
@ -210,6 +210,8 @@ const char
|
||||
SESSION_ID_NAME[] = "SESSION_ID",
|
||||
CURRENT_USER_NAME[] = "CURRENT_USER",
|
||||
CURRENT_ROLE_NAME[] = "CURRENT_ROLE",
|
||||
EVENT_TYPE_NAME[] = "EVENT_TYPE",
|
||||
OBJECT_TYPE_NAME[] = "OBJECT_TYPE",
|
||||
DDL_EVENT_NAME[] = "DDL_EVENT",
|
||||
OBJECT_NAME[] = "OBJECT_NAME",
|
||||
SQL_TEXT_NAME[] = "SQL_TEXT";
|
||||
@ -2136,8 +2138,12 @@ dsc* evlGetContext(thread_db* tdbb, const SysFunction*, const NestValueArray& ar
|
||||
const DdlTriggerContext& context = Stack<DdlTriggerContext>::const_iterator(
|
||||
attachment->ddlTriggersContext).object();
|
||||
|
||||
if (nameStr == DDL_EVENT_NAME)
|
||||
resultStr = context.ddlEvent;
|
||||
if (nameStr == EVENT_TYPE_NAME)
|
||||
resultStr = context.eventType;
|
||||
else if (nameStr == OBJECT_TYPE_NAME)
|
||||
resultStr = context.objectType;
|
||||
else if (nameStr == DDL_EVENT_NAME)
|
||||
resultStr = context.eventType + " " + context.objectType;
|
||||
else if (nameStr == OBJECT_NAME)
|
||||
{
|
||||
resultStr = context.objectName.c_str();
|
||||
|
@ -290,51 +290,51 @@ const int DB_TRIGGER_TRANS_COMMIT = 3;
|
||||
const int DB_TRIGGER_TRANS_ROLLBACK = 4;
|
||||
const int DB_TRIGGER_MAX = 5;
|
||||
|
||||
static const char* const DDL_TRIGGER_ACTION_NAMES[] =
|
||||
static const char* const DDL_TRIGGER_ACTION_NAMES[][2] =
|
||||
{
|
||||
NULL,
|
||||
"CREATE TABLE",
|
||||
"ALTER TABLE",
|
||||
"DROP TABLE",
|
||||
"CREATE PROCEDURE",
|
||||
"ALTER PROCEDURE",
|
||||
"DROP PROCEDURE",
|
||||
"CREATE FUNCTION",
|
||||
"ALTER FUNCTION",
|
||||
"DROP FUNCTION",
|
||||
"CREATE TRIGGER",
|
||||
"ALTER TRIGGER",
|
||||
"DROP TRIGGER",
|
||||
"", "", "", // gap for TRIGGER_TYPE_MASK - 3 bits
|
||||
"CREATE EXCEPTION",
|
||||
"ALTER EXCEPTION",
|
||||
"DROP EXCEPTION",
|
||||
"CREATE VIEW",
|
||||
"ALTER VIEW",
|
||||
"DROP VIEW",
|
||||
"CREATE DOMAIN",
|
||||
"ALTER DOMAIN",
|
||||
"DROP DOMAIN",
|
||||
"CREATE ROLE",
|
||||
"ALTER ROLE",
|
||||
"DROP ROLE",
|
||||
"CREATE INDEX",
|
||||
"ALTER INDEX",
|
||||
"DROP INDEX",
|
||||
"CREATE SEQUENCE",
|
||||
"ALTER SEQUENCE",
|
||||
"DROP SEQUENCE",
|
||||
"CREATE USER",
|
||||
"ALTER USER",
|
||||
"DROP USER",
|
||||
"CREATE COLLATION",
|
||||
"DROP COLLATION",
|
||||
"ALTER CHARACTER SET",
|
||||
"CREATE PACKAGE",
|
||||
"ALTER PACKAGE",
|
||||
"DROP PACKAGE",
|
||||
"CREATE PACKAGE BODY",
|
||||
"DROP PACKAGE BODY"
|
||||
{NULL, NULL},
|
||||
{"CREATE", "TABLE"},
|
||||
{"ALTER", "TABLE"},
|
||||
{"DROP", "TABLE"},
|
||||
{"CREATE", "PROCEDURE"},
|
||||
{"ALTER", "PROCEDURE"},
|
||||
{"DROP", "PROCEDURE"},
|
||||
{"CREATE", "FUNCTION"},
|
||||
{"ALTER", "FUNCTION"},
|
||||
{"DROP", "FUNCTION"},
|
||||
{"CREATE", "TRIGGER"},
|
||||
{"ALTER", "TRIGGER"},
|
||||
{"DROP", "TRIGGER"},
|
||||
{"", ""}, {"", ""}, {"", ""}, // gap for TRIGGER_TYPE_MASK - 3 bits
|
||||
{"CREATE", "EXCEPTION"},
|
||||
{"ALTER", "EXCEPTION"},
|
||||
{"DROP", "EXCEPTION"},
|
||||
{"CREATE", "VIEW"},
|
||||
{"ALTER", "VIEW"},
|
||||
{"DROP", "VIEW"},
|
||||
{"CREATE", "DOMAIN"},
|
||||
{"ALTER", "DOMAIN"},
|
||||
{"DROP", "DOMAIN"},
|
||||
{"CREATE", "ROLE"},
|
||||
{"ALTER", "ROLE"},
|
||||
{"DROP", "ROLE"},
|
||||
{"CREATE", "INDEX"},
|
||||
{"ALTER", "INDEX"},
|
||||
{"DROP", "INDEX"},
|
||||
{"CREATE", "SEQUENCE"},
|
||||
{"ALTER", "SEQUENCE"},
|
||||
{"DROP", "SEQUENCE"},
|
||||
{"CREATE", "USER"},
|
||||
{"ALTER", "USER"},
|
||||
{"DROP", "USER"},
|
||||
{"CREATE", "COLLATION"},
|
||||
{"DROP", "COLLATION"},
|
||||
{"ALTER", "CHARACTER SET"},
|
||||
{"CREATE", "PACKAGE"},
|
||||
{"ALTER", "PACKAGE"},
|
||||
{"DROP", "PACKAGE"},
|
||||
{"CREATE", "PACKAGE BODY"},
|
||||
{"DROP", "PACKAGE BODY"}
|
||||
};
|
||||
|
||||
const int DDL_TRIGGER_BEFORE = 0;
|
||||
|
Loading…
Reference in New Issue
Block a user