Stream triggers manipulation interfaces
=======================================

You can create stream triggers only on tables with
``REPLICA IDENTITY FULL`` or tables without any columns to which
``TOAST`` applies.

bdr.create_conflict_trigger
---------------------------

This function creates a new conflict trigger.

Synopsis
^^^^^^^^

.. code:: sql

   bdr.create_conflict_trigger(trigger_name text,
                               events text[],
                               relation regclass,
                               function regprocedure,
                               args text[] DEFAULT {})

Parameters
^^^^^^^^^^

-  ``trigger_name`` — Name of the new trigger.

-  ``events`` — Array of events on which to fire this trigger. Valid
   values are ‘``INSERT``’, ‘``UPDATE``’, and ‘``DELETE``’.

-  ``relation`` — Relation to fire this trigger for.

-  ``function`` — The function to execute.

-  ``args`` — Optional. Specifies the array of parameters the trigger
   function receives on execution (contents of ``TG_ARGV`` variable).

Notes
^^^^^

This function uses the same replication mechanism as ``DDL`` statements.
This means that the replication is affected by the :ref:`ddl filters <Replication sets>` 
configuration.

The function takes a global DML lock on the relation on which the
trigger is being created.

This function is transactional. You can roll back the effects with the
``ROLLBACK`` of the transaction. The changes are visible to the current
transaction.

Similar to normal PostgreSQL triggers, the
``bdr.create_conflict_trigger`` function requires ``TRIGGER`` privilege
on the ``relation`` and ``EXECUTE`` privilege on the function. This
applies with a ``bdr.backwards_compatibility`` of 30619 or above.
Additional security rules apply in PGD to all triggers including
conflict triggers. See :ref:`Security and roles <Security and roles>`  .

bdr.create_transform_trigger
----------------------------

This function creates a transform trigger.

.. _synopsis-1:

Synopsis
^^^^^^^^

.. code:: sql

   bdr.create_transform_trigger(trigger_name text,
                                events text[],
                                relation regclass,
                                function regprocedure,
                                args text[] DEFAULT {})

.. _parameters-1:

Parameters
^^^^^^^^^^

-  ``trigger_name`` — Name of the new trigger.

-  ``events`` — Array of events on which to fire this trigger. Valid
   values are ‘``INSERT``’, ‘``UPDATE``’, and ‘``DELETE``’.

-  ``relation`` — Relation to fire this trigger for.

-  ``function`` — The function to execute.

-  ``args`` — Optional. Specify array of parameters the trigger function
   receives on execution (contents of ``TG_ARGV`` variable).

.. _notes-1:

Notes
^^^^^

This function uses the same replication mechanism as ``DDL`` statements.
This means that the replication is affected by the :ref:`ddl filters <Replication sets>` 
configuration.

The function takes a global DML lock on the relation on which the
trigger is being created.

This function is transactional. You can roll back the effects with the
``ROLLBACK`` of the transaction. The changes are visible to the current
transaction.

Similarly to normal PostgreSQL triggers, the
``bdr.create_transform_trigger`` function requires the ``TRIGGER``
privilege on the ``relation`` and ``EXECUTE`` privilege on the function.
Additional security rules apply in PGD to all triggers including
transform triggers. See :ref:`Security and roles <Security and roles>`  .

bdr.drop_trigger
----------------

This function removes an existing stream trigger (both conflict and
transform).

.. _synopsis-2:

Synopsis
^^^^^^^^

.. code:: sql

   bdr.drop_trigger(trigger_name text,
                    relation regclass,
                    ifexists boolean DEFAULT false)

.. _parameters-2:

Parameters
^^^^^^^^^^

-  ``trigger_name`` — Name of an existing trigger.

-  ``relation`` — The relation the trigger is defined for.

-  ``ifexists`` — When set to ``true`` , this function ignores missing
   triggers.

.. _notes-2:

Notes
^^^^^

This function uses the same replication mechanism as ``DDL`` statements.
This means that the replication is affected by the :ref:`ddl filters <Replication sets>` 
configuration.

The function takes a global DML lock on the relation on which the
trigger is being created.

This function is transactional. You can roll back the effects with the
``ROLLBACK`` of the transaction. The changes are visible to the current
transaction.

Only the owner of the ``relation`` can execute the ``bdr.drop_trigger``
function.
