8
0
mirror of https://github.com/FirebirdSQL/firebird.git synced 2025-01-23 00:03:02 +01:00
firebird-mirror/doc/sql.extensions
hvlad c0e9a56fc8 1. Added new EXECUTE BLOCK statement
2. Added 	default paremeters in stored procedures
2004-01-16 09:32:57 +00:00
..
README.aggregate_tracking Please give some comments 2003-07-29 00:55:34 +00:00
README.case documentation for new sql clauses case, coalesce and nullif 2002-08-08 23:33:23 +00:00
README.coalesce documentation for new sql clauses case, coalesce and nullif 2002-08-08 23:33:23 +00:00
README.context_variables Added extra note. 2003-10-08 09:15:31 +00:00
README.data_types no message 2003-07-15 10:32:02 +00:00
README.default_parameters 1. Added new EXECUTE BLOCK statement 2004-01-16 09:32:57 +00:00
README.exception_handling Added some documentation for RelNotes. More will follow shortly. 2003-07-15 09:09:28 +00:00
README.execute_block 1. Added new EXECUTE BLOCK statement 2004-01-16 09:32:57 +00:00
README.execute_statement Added security note 2003-10-06 13:22:11 +00:00
README.explicit_locks Fix typo 2003-07-31 11:54:46 +00:00
README.nullif Update the description, it is now correct. 2002-08-09 07:25:49 +00:00
README.order_by_expressions_nulls Correct docs a little 2003-07-28 09:21:08 +00:00
README.savepoints Added docs for savepoints 2003-07-29 11:33:26 +00:00
README.universal_triggers Added some documentation for RelNotes. More will follow shortly. 2003-07-15 09:09:28 +00:00

---------------------------
Universal triggers (FB 1.5)
---------------------------

  Function:
    Allows triggers that handle multiple row operations.

  Author:
    Dmitry Yemanov <yemanov@yandex.ru>

  Syntax rules:
    CREATE TRIGGER name FOR table
      [ACTIVE | INACTIVE]
      {BEFORE | AFTER} <multiple_action>
      [POSITION number]
    AS trigger_body
    
    <multiple_action> ::= <single_action> [OR <single_action> [OR <single_action>]]
    <single_action> ::= {INSERT | UPDATE | DELETE}

  Example(s):
    1. CREATE TRIGGER TRIGGER1 FOR TABLE1 BEFORE INSERT OR UPDATE AS ...;
    2. CREATE TRIGGER TRIGGER2 FOR TABLE2 AFTER INSERT OR UPDATE OR DELETE AS ...;

  ODS:
    Encoding of field RDB$TRIGGER_TYPE (relation RDB$TRIGGERS) has been extended
    to allow complex trigger actions. Coding scheme is shown below (in C syntax):
    
    // trigger type prefixes
    #define TRIGGER_BEFORE		0
    #define TRIGGER_AFTER		1

    // trigger type suffixes
    #define TRIGGER_INSERT		1
    #define TRIGGER_UPDATE		2
    #define TRIGGER_DELETE		3

    // that's how trigger action types are encoded
	/*
    bit 0 = TRIGGER_BEFORE/TRIGGER_AFTER flag,
    bits 1-2 = TRIGGER_INSERT/TRIGGER_UPDATE/TRIGGER_DELETE (slot #1),
    bits 3-4 = TRIGGER_INSERT/TRIGGER_UPDATE/TRIGGER_DELETE (slot #2),
    bits 5-6 = TRIGGER_INSERT/TRIGGER_UPDATE/TRIGGER_DELETE (slot #3),
    and finally the above calculated value is decremented

    example #1:
        TRIGGER_AFTER_DELETE =
        = ((TRIGGER_DELETE << 1) | TRIGGER_AFTER) - 1 =
        = ((3 << 1) | 1) - 1 =
        = 0x00000110 (6)

    example #2:
        TRIGGER_BEFORE_INSERT_UPDATE =
        = ((TRIGGER_UPDATE << 3) | (TRIGGER_INSERT << 1) | TRIGGER_BEFORE) - 1 =
        = ((2 << 3) | (1 << 1) | 0) - 1 =
        = 0x00010001 (17)

    example #3:
        TRIGGER_AFTER_UPDATE_DELETE_INSERT =
        = ((TRIGGER_INSERT << 5) | (TRIGGER_DELETE << 3) | (TRIGGER_UPDATE << 1) | TRIGGER_AFTER) - 1 =
        = ((1 << 5) | (3 << 3) | (2 << 1) | 1) - 1 =
        = 0x00111100 (60)
    */

  Note(s):
    1. One-action triggers are fully compatible at ODS level with FB 1.0.
    2. RDB$TRIGGER_TYPE encoding is order-dependant, i.e.
       BEFORE INSERT OR UPDATE and BEFORE UPDATE OR INSERT will be coded differently,
       although they have the same semantics and will be executed exactly the same way.
    3. In multiple-action triggers both OLD and NEW contexts are available. If the
       trigger invocation forbids one of them (e.g. OLD context for INSERT operation),
       then all fields of that context will eveluate to NULL. If you assign to
       unproper context, runtime exception will be thrown.
    4. You may use new context variables INSERTING/UPDATEING/DELETING to check the
       operation type at runtime.

  See also:
    README.context_variables