8
0
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:
asfernandes 2011-02-20 01:08:48 +00:00
parent 98efcd9a9d
commit dfe830af7c
6 changed files with 71 additions and 52 deletions

View File

@ -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'),

View File

@ -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;

View File

@ -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>";
}

View File

@ -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;
};

View File

@ -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();

View File

@ -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;