{"id":46803,"date":"2026-09-21T09:11:00","date_gmt":"2026-09-21T07:11:00","guid":{"rendered":"https:\/\/www.dbi-services.com\/blog\/?p=46803"},"modified":"2026-09-21T09:17:35","modified_gmt":"2026-09-21T07:17:35","slug":"ddl-filtering-in-goldengate-extract-and-replicat","status":"publish","type":"post","link":"https:\/\/www.dbi-services.com\/blog\/ddl-filtering-in-goldengate-extract-and-replicat\/","title":{"rendered":"DDL Filtering in GoldenGate Extract and Replicat"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">When replicating data with GoldenGate, you often want DDL changes (table alterations, new tables, dropped indexes, etc.) to follow alongside DML. But replicating <em>all<\/em> DDL is sometimes dangerous (<code>TRUNCATE<\/code>, <code>DROP TABLE<\/code>) or simply impossible (architecture differences between source and target). DDL filtering gives you precise control over this.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This blog covers multiple aspects, including latest changes introduced in GoldenGate 26ai:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"#extract-vs-replicat-ddl-filtering\">Difference between extract and replicat filtering<\/a><\/li>\n\n\n\n<li><a href=\"#scopes-mapped-unmapped-all-other\">DDL filtering model and syntax<\/a><\/li>\n\n\n\n<li><a href=\"#andor-logic\">AND\/OR logic<\/a><\/li>\n\n\n\n<li><a href=\"#the-ddloptions-parameter\"><code>DDLOPTIONS<\/code> parameter<\/a><\/li>\n\n\n\n<li><a href=\"#tag-based-ddl-filtering-excludetag-and-includetag\">Tag-based filtering (<code>EXCLUDETAG<\/code>\/<code>INCLUDETAG<\/code>)<\/a><\/li>\n\n\n\n<li><a href=\"#edge-cases\">Edge cases<\/a><\/li>\n<\/ul>\n\n\n\n<h2 id=\"extract-vs-replicat-ddl-filtering\" class=\"wp-block-heading\">Extract vs Replicat DDL filtering<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Before diving into the syntax, you should understand that DDL filtering means something <strong>different for an extract and a replicat<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>For an extract<\/strong>, filtering controls what gets <strong>written to the trail file<\/strong>. If a DDL statement is excluded at the extract level, it is gone forever, and will never reach any downstream replicat. This makes extract-level filtering absolute and decisive. On the other side, it keeps trail files smaller and ensures no downstream replicat ever sees unwanted DDL.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>For a replicat<\/strong>, filtering controls what gets <strong>applied to the target database<\/strong>. In that case, the DDL statement is considered to be already in the trail file. The replicat simply chooses to apply it or skip it. This gives more flexibility. For instance, multiple replicats can read the same trail and each apply a different subset of DDL. Of course, the <strong>trail files are larger<\/strong>, and generate more I\/O.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This does not mean that you should choose one or another. A common use case is to do <strong>generic filtering at the extract level<\/strong> (removing clearly irrelevant DDL like <code>CREATE USER<\/code> or <code>GRANT<\/code>), and more <strong>targeted filtering for each replicat<\/strong> (for example, suppressing <code>TRUNCATE<\/code> on a target holding additional rows).<\/p>\n\n\n\n<h2 id=\"enabling-ddl-replication\" class=\"wp-block-heading\">Enabling DDL Replication<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">DDL replication is <strong>disabled by default<\/strong>. You must explicitly enable it in both extract and replicat parameter files.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The simplest form is:<\/p>\n\n\n\n<div class=\"proof-block\"><div class=\"code-block-wrapper\"><pre tabindex=\"0\" data-language=\"text\"><code>DDL<\/code><\/pre><\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">This enables DDL replication with no filtering. All DDL is captured (extract) or applied (replicat). In practice this is almost never what you want. You will almost always pair it with <code>INCLUDE<\/code> or <code>EXCLUDE<\/code> clauses.<\/p>\n\n\n\n<h2 id=\"scopes-mapped-unmapped-other-all\" class=\"wp-block-heading\">Scopes: <code>MAPPED<\/code>, <code>UNMAPPED<\/code>, <code>OTHER<\/code>, <code>ALL<\/code><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Every DDL statement GoldenGate encounters is classified into one of four scopes based on whether the object it operates on matches your <code>TABLE<\/code> (extract) or <code>MAP<\/code> (replicat) parameter list.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><thead><tr><th>Scope<\/th><th>Meaning<\/th><\/tr><\/thead><tbody><tr><td><code>MAPPED<\/code><\/td><td>The DDL object matches a <code>TABLE<\/code>\/<code>MAP<\/code> entry<\/td><\/tr><tr><td><code>UNMAPPED<\/code><\/td><td>The DDL object does NOT match any <code>TABLE<\/code>\/<code>MAP<\/code> entry<\/td><\/tr><tr><td><code>OTHER<\/code><\/td><td>DDL not associated with a specific object at all (e.g. <code>CREATE USER<\/code>, <code>CREATE TABLESPACE<\/code>)<\/td><\/tr><tr><td><code>ALL<\/code><\/td><td><code>MAPPED<\/code>, <code>UNMAPPED<\/code>, and <code>OTHER<\/code><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">If you do not specify a scope, <strong>GoldenGate defaults to <code>ALL<\/code><\/strong>.<\/p>\n\n\n\n<h3 id=\"example\" class=\"wp-block-heading\">Example<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">With this extract parameter file:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>EXTRACT EXT\nUSERIDALIAS source_cdb DOMAIN OracleGoldenGate\nEXTTRAIL pdb1\/aa\nSOURCECATALOG PDB1\nDDL INCLUDE ALL\nTABLE APP_SCHEMA.*;<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li><code>CREATE TABLE APP_SCHEMA.ORDERS (...)<\/code> is <strong><code>MAPPED<\/code><\/strong> (matches <code>APP_SCHEMA.*<\/code>)<\/li>\n\n\n\n<li><code>CREATE TABLE AUDIT_SCHEMA.LOGS (...)<\/code> is <strong><code>UNMAPPED<\/code><\/strong> (does not match <code>APP_SCHEMA.*<\/code>)<\/li>\n\n\n\n<li><code>GRANT SELECT ON APP_SCHEMA.ORDERS TO READONLY<\/code> is <span class=\"proof-marker\"><strong><code>MAPPED<\/code><\/strong> (a <code>GRANT<\/code> on a specific object follows that object\u2019s own scope, not <code>OTHER<\/code>. <code>OTHER<\/code> is only for DDL with no target object at all, like <code>CREATE USER<\/code>)<\/span><\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Switching to <code>DDL INCLUDE MAPPED<\/code> would capture the first and third statements.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The DDL statement\u2019s scope depends on the operation: see \u201cInteraction with <code>TABLE<\/code> and <code>MAP<\/code> Parameters\u201d below for more details.<\/p>\n\n\n\n<h2 id=\"filter-keywords\" class=\"wp-block-heading\">Filter Keywords<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">On top of scope filtering, you can also filter DDL by <strong>object type, operation type, object name, and DDL text content<\/strong>. These filters are specified as comma-separated conditions within a single <code>DDL<\/code> clause. All conditions in a single clause are added together (logical <code>AND<\/code>).<\/p>\n\n\n\n<h3 id=\"objtype\" class=\"wp-block-heading\"><code>OBJTYPE<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Filters by the type of database object the DDL operates on.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Common Oracle object types: <code>TABLE<\/code>, <code>INDEX<\/code>, <code>SEQUENCE<\/code>, <code>VIEW<\/code>, <code>PROCEDURE<\/code>, <code>FUNCTION<\/code>, <code>TRIGGER<\/code>, <code>PACKAGE<\/code>, <code>TYPE<\/code>, <code>SYNONYM<\/code>, <code>DATABASE LINK<\/code>, <code>TABLESPACE<\/code>, <code>USER<\/code>.<\/p>\n\n\n\n<div class=\"proof-block\"><div class=\"code-block-wrapper\"><pre tabindex=\"0\" data-language=\"text\"><code>-- Only capture DDL on tables\nDDL INCLUDE MAPPED, OBJTYPE 'TABLE'\n\n-- Only capture DDL on indexes\nDDL INCLUDE MAPPED, OBJTYPE 'INDEX'<\/code><\/pre><\/div><\/div>\n\n\n\n<h3 id=\"optype\" class=\"wp-block-heading\"><code>OPTYPE<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Filters by the type of DDL operation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Common operation types: <code>CREATE<\/code>, <code>ALTER<\/code>, <code>DROP<\/code>, <code>RENAME<\/code>, <code>TRUNCATE<\/code>, <code>GRANT<\/code>, <code>REVOKE<\/code>, <code>COMMENT<\/code>.<\/p>\n\n\n\n<div class=\"proof-block\"><div class=\"code-block-wrapper\"><pre tabindex=\"0\" data-language=\"text\"><code>-- Only capture CREATE TABLE statements\nDDL INCLUDE MAPPED, OBJTYPE 'TABLE', OPTYPE CREATE\n\n-- Exclude DROP operations on all object types\nDDL EXCLUDE MAPPED, OPTYPE DROP<\/code><\/pre><\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span class=\"proof-marker\"><code>OPTYPE RENAME<\/code> exists and works, but classification depends on the exact SQL used. A <code>RENAME old TO new;<\/code> statement matches <code>OPTYPE RENAME<\/code> (GoldenGate logs <code>OGG-10457 DDL RENAME found ... RENAME converted to ALTER TABLE<\/code> while writing it, then classifies the resulting <code>OGG-10451<\/code>\/<code>OGG-10452<\/code> line as <code>optype [RENAME]<\/code>). But <code>ALTER TABLE ... RENAME TO ...<\/code> (the form most people write, since <code>RENAME<\/code> cannot be schema-qualified) matches <code>OPTYPE ALTER<\/code> instead, with no <code>RENAME<\/code> classification and no conversion message at all.<\/span><\/p>\n\n\n\n<h3 id=\"objname\" class=\"wp-block-heading\"><code>OBJNAME<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Filters by object name. Supports wildcards (<code>*<\/code> for any sequence of characters, <code>?<\/code> for a single character). For Oracle, use the <code>schema.object<\/code> format, or <code>container.schema.object<\/code> in multitenant. <span class=\"proof-marker\">Write the value with no quotes at all. <code>OBJNAME 'APP_SCHEMA.*'<\/code> (single-quoted) abends with <code>OGG-06377 Single quote marks cannot be used to delimit OBJNAME<\/code>, and <code>OBJNAME \"APP_SCHEMA.*\"<\/code> (double-quoted) abends differently, with <code>OGG-06585 No schema is specified<\/code>. A double-quoted value is taken as one literal token and never splits on its dot into schema and object.<\/span><\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>-- Only capture DDL for tables starting with ORD_ in APP_SCHEMA\nDDL INCLUDE MAPPED, OBJTYPE 'TABLE', OBJNAME APP_SCHEMA.ORD_*\n\n-- Exclude DDL on any staging table\nDDL EXCLUDE MAPPED, OBJNAME APP_SCHEMA.*_STG<\/code><\/pre>\n\n\n\n<h3 id=\"instr\" class=\"wp-block-heading\"><code>INSTR<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Filters based on whether a literal string appears anywhere in the DDL text (case-sensitive). This is especially useful for <strong>excluding<\/strong> certain kinds of DDL.<\/p>\n\n\n\n<div class=\"proof-block\"><div class=\"code-block-wrapper\"><pre tabindex=\"0\" data-language=\"text\"><code>-- Exclude any DDL containing NOLOGGING\nDDL EXCLUDE MAPPED, INSTR 'NOLOGGING'\n\n-- Exclude DDL referencing a specific tablespace by name\nDDL EXCLUDE MAPPED, INSTR 'ARCHIVE_TBS'<\/code><\/pre><\/div><\/div>\n\n\n\n<h3 id=\"instrwords\" class=\"wp-block-heading\"><code>INSTRWORDS<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Similar to <code>INSTR<\/code>, but performs word-level matching. The order of the words does not matter, and partial matches within longer words are not counted.<\/p>\n\n\n\n<div class=\"proof-block\"><div class=\"code-block-wrapper\"><pre tabindex=\"0\" data-language=\"text\"><code>-- Exclude DDL that contains both the words COMPRESS and OLTP (in any order)\nDDL EXCLUDE MAPPED, INSTRWORDS 'COMPRESS OLTP'<\/code><\/pre><\/div><\/div>\n\n\n\n<h3 id=\"eventactions\" class=\"wp-block-heading\"><code>EVENTACTIONS<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Unlike the keywords above, <code>EVENTACTIONS<\/code> is not specific to <code>DDL<\/code>: it is a general GoldenGate keyword also usable on <code>TABLE<\/code> and <code>MAP<\/code> clauses, for triggering an action (<code>REPORT<\/code>, <code>LOG<\/code>, and others) whenever a record matches that clause. It happens to be usable inside a <code>DDL<\/code> clause too, comma-separated alongside <code>OBJTYPE<\/code>\/<code>OPTYPE<\/code>\/<code>OBJNAME<\/code>\/<code>INSTR<\/code> like any other filter keyword, and it comes with real, DDL-specific behavior worth knowing.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>EVENTACTIONS (REPORT)<\/code> forces the same <code>DDL replication statistics<\/code> block that <code>DDLOPTIONS REPORT<\/code> writes on demand (see the <code>DDLOPTIONS<\/code> section below). However, it <strong>only works on an <code>INCLUDE<\/code> clause<\/strong>:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>DDL INCLUDE MAPPED, EVENTACTIONS (REPORT)<\/code><\/pre>\n\n\n\n<div class=\"proof-block\"><div class=\"code-block-wrapper\"><pre tabindex=\"0\" data-language=\"text\"><code>2026-09-05 11:52:47  INFO    OGG-01487  DDL found, operation [create table ddltest.evt1 (id number) (size 37)], start SCN [24368602], commit SCN [24368634] instance [ (1)], DDL seqno [0], marker seqno [0].\n\n2026-09-05 11:52:47  INFO    OGG-10451  DDL operation included [INCLUDE MAPPED, EVENTACTIONS (REPORT)], optype [CREATE], objtype [TABLE], catalog \"PDB1\", objowner \"DDLTEST\", objname \"EVT1\".\n\n***********************************************************************\n*                   ** Run Time Statistics **                         *\n***********************************************************************\n\n\nReport at 2026-09-05 11:52:47.388472 (activity since 2026-09-05 11:50:36.261708)\n\nOutput to dt:\n\n\n\nDDL replication statistics:\n\n                    Operations:         0\n             Mapped operations:         0\n           Unmapped operations:         0\n              Other operations:         0\n           Excluded operations:         0\n\n\nNo records extracted.<\/code><\/pre><\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>This is verbose.<\/strong> A second <code>CREATE TABLE<\/code> matching the same clause produced a second, identical-shaped block right after its own <code>OGG-10451<\/code> line. This means that every matching DDL gets its own full statistics dump on top of the usual <code>OGG-01487<\/code>\/<code>OGG-10451<\/code>\/<code>OGG-10452<\/code> lines. On a replication with any real amount of DDL traffic, this multiplies report file growth well past what plain <code>DDLOPTIONS REPORT<\/code> alone produces.  Try to restrict <code>EVENTACTIONS (REPORT)<\/code> to a narrow <code>INCLUDE<\/code> clause: a specific <code>OBJTYPE<\/code>, <code>OPTYPE<\/code>, or <code>OBJNAME<\/code> you want to log in the report file.<\/p>\n\n\n\n<div class=\"proof-block\"><p>Please note that the behavior is different for <code>EXCLUDE<\/code> clauses. The same <code>EVENTACTIONS (REPORT)<\/code> written on an <code>EXCLUDE<\/code> clause instead (see below example) excludes a <code>TRUNCATE<\/code> normally (<code>OGG-10452 DDL operation excluded [EXCLUDE MAPPED, OPTYPE TRUNCATE, EVENTACTIONS (REPORT)]<\/code>), but no <code>DDL replication statistics<\/code> block follows it.<\/p><\/div>\n\n\n\n<pre class=\"wp-block-code\"><code>DDL INCLUDE MAPPED &amp;\n    EXCLUDE MAPPED, OPTYPE TRUNCATE, EVENTACTIONS (REPORT)<\/code><\/pre>\n\n\n\n<h2 id=\"andor-logic\" class=\"wp-block-heading\"><code>AND<\/code>\/<code>OR<\/code> Logic<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><span class=\"proof-marker\"><strong>Only one <code>DDL<\/code> parameter is allowed per parameter file.<\/strong> A parameter file with two separate <code>DDL<\/code> lines abends at startup with <code>OGG-00403 There can be only one DDL filtering statement<\/code>: \u201cOnly one DDL parameter can be used in a parameter file, but you can combine multiple inclusion and exclusion options to filter the DDL to the required level.\u201d Everything below happens <strong>inside that single <code>DDL<\/code> parameter<\/strong>: each clause after the first drops the leading <code>DDL<\/code> keyword and starts directly with <code>INCLUDE<\/code> or <code>EXCLUDE<\/code>, and the whole thing is continued with <code>&amp;<\/code>.<\/span><\/p>\n\n\n\n<h3 id=\"and-conditions-within-a-single-ddl-clause\" class=\"wp-block-heading\"><code>AND<\/code>: conditions within a single <code>DDL<\/code> clause<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A DDL statement must satisfy <strong>all<\/strong> conditions to match.<\/p>\n\n\n\n<div class=\"proof-block\"><div class=\"code-block-wrapper\"><pre tabindex=\"0\" data-language=\"text\"><code>-- Capture only CREATE TABLE in APP_SCHEMA (all three conditions must be true)\nDDL INCLUDE MAPPED, OBJTYPE 'TABLE', OPTYPE CREATE, OBJNAME APP_SCHEMA.*<\/code><\/pre><\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">A <code>DROP TABLE APP_SCHEMA.ORDERS<\/code> would not match this clause because <code>OPTYPE DROP<\/code> is different from <code>OPTYPE CREATE<\/code>.<\/p>\n\n\n\n<h3 id=\"or-multiple-includeexclude-clauses\" class=\"wp-block-heading\"><code>OR<\/code>: multiple <code>INCLUDE<\/code>\/<code>EXCLUDE<\/code> clauses<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Only one <code>DDL<\/code> parameter is allowed per parameter file, but that parameter can carry multiple <code>INCLUDE<\/code>\/<code>EXCLUDE<\/code> clauses, separated with <code>&amp;<\/code>. Multiple <code>INCLUDE<\/code> clauses are evaluated as a logical <code>OR<\/code>: a DDL statement is captured if it matches <strong>any<\/strong> <code>INCLUDE<\/code> clause. The indentation is optional.<\/p>\n\n\n\n<div class=\"proof-block\"><div class=\"code-block-wrapper\"><pre tabindex=\"0\" data-language=\"text\"><code>-- Capture CREATE TABLE or CREATE SEQUENCE (either clause is sufficient)\nDDL INCLUDE MAPPED, OBJTYPE 'TABLE', OPTYPE CREATE &amp;\n    INCLUDE MAPPED, OBJTYPE 'SEQUENCE', OPTYPE CREATE<\/code><\/pre><\/div><\/div>\n\n\n\n<h3 id=\"exclude-always-wins-over-include\" class=\"wp-block-heading\"><code>EXCLUDE<\/code> always wins over <code>INCLUDE<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">If a DDL statement matches both an <code>INCLUDE<\/code> clause and an <code>EXCLUDE<\/code> clause, the <code>EXCLUDE<\/code> wins. This lets you set broader <code>INCLUDE<\/code> rules and choose specific exceptions. An <code>EXCLUDE<\/code> clause always needs a corresponding <code>INCLUDE<\/code> clause in the same <code>DDL<\/code> parameter, it cannot stand alone.<\/p>\n\n\n\n<div class=\"proof-block\"><div class=\"code-block-wrapper\"><pre tabindex=\"0\" data-language=\"text\"><code>-- Include all MAPPED DDL, but exclude TRUNCATE\nDDL INCLUDE MAPPED &amp;\n    EXCLUDE MAPPED, OPTYPE TRUNCATE<\/code><\/pre><\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\"><span class=\"proof-marker\">A lone <code>EXCLUDE<\/code> clause with no corresponding <code>INCLUDE<\/code> still abends (<code>OGG-06374 Invalid DDL statement: No INCLUDE<\/code>). <code>EXCLUDE<\/code> narrows an <code>INCLUDE<\/code>; it cannot stand alone.<\/span> Every multi-clause example in this post uses this single-<code>DDL<\/code>-parameter, <code>&amp;<\/code>-continued form.<\/p>\n\n\n\n<h2 id=\"filtering-examples\" class=\"wp-block-heading\">Filtering Examples<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">You can build nearly all sorts of DDL filtering in GoldenGate. But you should <strong>always ensure<\/strong> that they are <strong>relevant to the workload on the source and target<\/strong> databases !<\/p>\n\n\n\n<h3 id=\"example-1-structural-ddl-only-no-destructive-operations\" class=\"wp-block-heading\">Example 1: Structural DDL only, no destructive operations<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Goal: replicate <code>CREATE<\/code> and <code>ALTER<\/code> on tables and sequences, but never <code>DROP<\/code> or <code>TRUNCATE<\/code>.<\/p>\n\n\n\n<div class=\"proof-block\"><div class=\"code-block-wrapper\"><pre tabindex=\"0\" data-language=\"text\"><code>DDL INCLUDE MAPPED, OBJTYPE 'TABLE', OPTYPE CREATE &amp;\n    INCLUDE MAPPED, OBJTYPE 'TABLE', OPTYPE ALTER &amp;\n    INCLUDE MAPPED, OBJTYPE 'SEQUENCE', OPTYPE CREATE &amp;\n    INCLUDE MAPPED, OBJTYPE 'SEQUENCE', OPTYPE ALTER<\/code><\/pre><\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">Any <code>DROP TABLE<\/code>, <code>TRUNCATE TABLE<\/code>, or <code>DROP SEQUENCE<\/code> on a mapped object will be silently ignored.<\/p>\n\n\n\n<h3 id=\"example-2-everything-except-nologging-directives\" class=\"wp-block-heading\">Example 2: Everything except <code>NOLOGGING<\/code> directives<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Here, the goal is to replicate all <code>MAPPED<\/code> DDL, but exclude any DDL containing the <code>NOLOGGING<\/code> directive.<\/p>\n\n\n\n<div class=\"proof-block\"><div class=\"code-block-wrapper\"><pre tabindex=\"0\" data-language=\"text\"><code>DDL INCLUDE MAPPED &amp;\n    EXCLUDE MAPPED, INSTR 'NOLOGGING'<\/code><\/pre><\/div><\/div>\n\n\n\n<h3 id=\"example-3-replicat-applies-only-a-subset-of-a-rich-trail\" class=\"wp-block-heading\">Example 3: Replicat applies only a subset of a rich trail<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">If a trail was generated with <code>DDL INCLUDE ALL<\/code> at the extract level, and you need the replicat to apply only <code>CREATE TABLE<\/code> and <code>ALTER TABLE<\/code> on mapped objects:<\/p>\n\n\n\n<div class=\"proof-block\"><div class=\"code-block-wrapper\"><pre tabindex=\"0\" data-language=\"text\"><code>DDL INCLUDE MAPPED, OBJTYPE 'TABLE', OPTYPE CREATE &amp;\n    INCLUDE MAPPED, OBJTYPE 'TABLE', OPTYPE ALTER\nMAP APP_SCHEMA.*, TARGET TARGET_SCHEMA.*;<\/code><\/pre><\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">All other DDLs in the trail (<code>DROP<\/code>, <code>TRUNCATE<\/code>, index changes, sequences) are skipped by this replicat.<\/p>\n\n\n\n<h3 id=\"example-4-mapped-objects-plus-a-specific-unmapped-schema\" class=\"wp-block-heading\">Example 4: Mapped objects plus a specific unmapped schema<\/h3>\n\n\n\n<div class=\"proof-block\"><div class=\"code-block-wrapper\"><pre tabindex=\"0\" data-language=\"text\"><code>-- Capture DDL for APP_SCHEMA (mapped) and also for SHARED_SCHEMA (not in the TABLE filtering)\nDDL INCLUDE MAPPED &amp;\n    INCLUDE UNMAPPED, OBJNAME SHARED_SCHEMA.* &amp;\n    EXCLUDE MAPPED, OPTYPE TRUNCATE &amp;\n    EXCLUDE UNMAPPED, OPTYPE DROP\nTABLE APP_SCHEMA.*;<\/code><\/pre><\/div><\/div>\n\n\n\n<h2 id=\"ddloptions-parameter\" class=\"wp-block-heading\"><code>DDLOPTIONS<\/code> parameter<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><code>DDLOPTIONS<\/code> often comes with <code>DDL<\/code> and controls what happens when DDL is processed. It is a global setting which applies to <strong>all<\/strong> DDL replication.<\/p>\n\n\n\n<h3 id=\"report\" class=\"wp-block-heading\"><code>REPORT<\/code><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Writes each DDL statement encountered (whether included or excluded) to the extract or replicat report file.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>DDLOPTIONS REPORT<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">With <code>DDL INCLUDE ALL<\/code>, a <code>CREATE TABLE DDLTEST.PROMOTIONS<\/code> on the source produces entries like these in the report file:<\/p>\n\n\n\n<div class=\"proof-block\"><div class=\"code-block-wrapper\"><pre tabindex=\"0\" data-language=\"text\"><code>2026-09-05 16:10:12  INFO    OGG-01487  DDL found, operation [create table ddltest.promotions (id number, discount number) (size 60)], start SCN [23026101], commit SCN [23026117] instance [ (1)], DDL seqno [0], marker seqno [0].\n2026-09-05 16:10:12  INFO    OGG-10451  DDL operation included [INCLUDE ALL], optype [CREATE], objtype [TABLE], catalog \"PDB1\", objowner \"DDLTEST\", objname \"PROMOTIONS\".<\/code><\/pre><\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">This is very useful for <strong>testing, or when the DDL volume is low<\/strong>. However, <strong>never include <code>DDLOPTIONS REPORT<\/code><\/strong> if you have a lot of DDLs. Your report files will grow without control.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A running process also keeps a running count of DDL statements by scope, separate from the per-statement <code>DDLOPTIONS REPORT<\/code> lines above. Request it on demand with <code>SEND EXTRACT &lt;name&gt;, REPORT<\/code> (or <code>SEND REPLICAT &lt;name&gt;, REPORT<\/code>) through the <code>adminclient<\/code>. It also gets written automatically whenever the process stops.<\/p>\n\n\n\n<div class=\"proof-block\"><div class=\"code-block-wrapper\"><pre tabindex=\"0\" data-language=\"text\"><code>***********************************************************************\n*                   ** Run Time Statistics **                         *\n***********************************************************************\n\nReport at 2026-09-05 11:34:23.315905 (activity since 2026-09-05 11:31:27.204191)\n\nDDL replication statistics:\n\n                    Operations:         1\n             Mapped operations:         1\n           Unmapped operations:         0\n              Other operations:         0\n           Excluded operations:         0<\/code><\/pre><\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">The report (<code>Mapped<\/code>\/<code>Unmapped<\/code>\/<code>Other<\/code>\/<code>Excluded<\/code>) mirrors the scope model from the \u201cScopes\u201d section above, so it is a quick way to check whether your filtering is doing what you expect without scrolling through every individual <code>OGG-01487<\/code>\/<code>OGG-10451<\/code>\/<code>OGG-10452<\/code> line.<\/p>\n\n\n\n<h3 id=\"ddlerror-replicat-only\" class=\"wp-block-heading\"><code>DDLERROR<\/code> (Replicat only)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Controls what happens when a DDL statement fails on the target. The default is to abend.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>DDLERROR DEFAULT DISCARD<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\"><code>DDLERROR<\/code> is a top-level parameter, not a <code>DDLOPTIONS<\/code> sub-keyword. As you can imagine, use <code>DISCARD<\/code> with caution. It could silently leave the target schema out of sync.<\/p>\n\n\n\n<h2 id=\"tag-based-ddl-filtering-excludetag-and-includetag\" class=\"wp-block-heading\">Tag-Based DDL Filtering: <code>EXCLUDETAG<\/code> and <code>INCLUDETAG<\/code><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Oracle GoldenGate 26ai adds a second, independent filtering layer on top of everything above. You can now filter by <strong>tag<\/strong> rather than by scope or object. Every DDL statement GoldenGate encounters carries a tag identifying its origin.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">By default, an extract applies <code>DDLOPTIONS EXCLUDETAG +<\/code>, which <strong>excludes all tagged DDL<\/strong> unless a tag is explicitly allowed with <code>INCLUDETAG<\/code>:<\/p>\n\n\n\n<div class=\"proof-block\"><div class=\"code-block-wrapper\"><pre tabindex=\"0\" data-language=\"text\"><code>-- Exclude every tagged DDL statement by default (implicit default)\nDDLOPTIONS EXCLUDETAG +\n\n-- Explicitly allow DDL carrying tag 00 (Data Pump)\nDDLOPTIONS INCLUDETAG 00<\/code><\/pre><\/div><\/div>\n\n\n\n<p class=\"wp-block-paragraph\">The practical impact is on tools that stamp a session tag on the DDL they issue. For instance, <code>impdp<\/code> tags its DDL with tag <code>00<\/code>. Under GoldenGate 26ai default behavior, that DDL is excluded from replication unless the extract explicitly adds <code>DDLOPTIONS INCLUDETAG 00<\/code>. Please note that this is a behavioral <strong>change from earlier versions<\/strong> of GoldenGate. Before, <code>impdp<\/code> DDL was captured without any extra configuration needed. If an import via <code>impdp<\/code> is expected to replicate its DDL, check for this setting before assuming the default behavior still applies.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>EXCLUDETAG<\/code>\/<code>INCLUDETAG<\/code> do not replace the scope and filter-keyword model. A DDL statement still has to pass the <code>DDL INCLUDE<\/code>\/<code>DDL EXCLUDE<\/code> scope and keyword filtering described above. Both filtering systems have to allow the DDL.<\/p>\n\n\n\n<h2 id=\"interaction-with-table-and-map-parameters\" class=\"wp-block-heading\">Interaction with <code>TABLE<\/code> and <code>MAP<\/code> Parameters<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Here are the scope (<code>MAPPED<\/code>\/<code>UNMAPPED<\/code>\/\u2026) assignment rules for standard <code>TABLE<\/code> DDL.<\/p>\n\n\n\n<div class=\"proof-block\"><div class=\"table-scroll\">\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<table><thead><tr><th>DDL Operation<\/th><th>Scope evaluated on<\/th><\/tr><\/thead><tbody><tr><td><code>CREATE TABLE<\/code><\/td><td>The <em>new<\/em> object (checked against <code>TABLE<\/code>\/<code>MAP<\/code> wildcard)<\/td><\/tr><tr><td><code>ALTER TABLE<\/code><\/td><td>The <em>existing<\/em> object<\/td><\/tr><tr><td><code>DROP TABLE<\/code><\/td><td>The <em>dropped<\/em> object (its name before the drop)<\/td><\/tr><tr><td><code>RENAME TABLE<\/code><\/td><td>The <em>original<\/em> name (before renaming)<\/td><\/tr><tr><td><code>TRUNCATE TABLE<\/code><\/td><td>The <em>existing<\/em> object<\/td><\/tr><\/tbody><\/table><\/div><\/div>\n\n\n\n<h2 id=\"edge-cases\" class=\"wp-block-heading\">Edge Cases<\/h2>\n\n\n\n<h3 id=\"ddl-errors-from-cascading-object-dependencies\" class=\"wp-block-heading\">DDL errors from cascading object dependencies<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Some DDL operations have cascading effects that GoldenGate does not replicate automatically.<\/p>\n\n\n\n<div class=\"proof-block\"><p><strong>Source action:<\/strong><\/p><div class=\"code-block-wrapper\"><pre tabindex=\"0\" data-language=\"sql\"><code>DROP TABLE DDLTEST.CUSTOMERS CASCADE CONSTRAINTS;<\/code><\/pre><\/div><p>GoldenGate captures and replicates the <code>DROP TABLE<\/code>. On the source, any views or constraints that depended on <code>DDLTEST.CUSTOMERS<\/code> are automatically dropped or invalidated. On the target, dependent objects created outside of the GoldenGate replication remain, as invalid objects.<\/p><p>For instance, if you create a view named <code>DDLTEST_TGT.CUSTOMERS_V<\/code> directly on the target (outside of GoldenGate) on <code>DDLTEST_TGT.CUSTOMERS<\/code>, the <code>DROP TABLE ... CASCADE CONSTRAINTS<\/code> on the source replicates and applies cleanly:<\/p><div class=\"code-block-wrapper\"><pre tabindex=\"0\" data-language=\"log\"><code>2026-09-05 20:23:38  INFO    OGG-00482  DDL found, operation [drop table ddltest.customers cascade constraints].\n2026-09-05 20:23:38  INFO    OGG-00489  DDL is of mapped scope, after mapping new operation [drop table \"DDLTEST_TGT\".\"CUSTOMERS\" cascade constraints].\n2026-09-05 20:23:38  INFO    OGG-10451  DDL operation included [INCLUDE MAPPED], optype [DROP], objtype [TABLE], catalog \"PDB1\", objowner \"DDLTEST_TGT\", objname \"CUSTOMERS\".\n2026-09-05 20:23:38  INFO    OGG-00484  Executing DDL operation.\n2026-09-05 20:23:38  INFO    OGG-00483  DDL operation successful.<\/code><\/pre><\/div><p>But <code>DDLTEST_TGT.CUSTOMERS_V<\/code> is left behind, now referencing a table that no longer exists:<\/p><div class=\"code-block-wrapper\"><pre tabindex=\"0\" data-language=\"sql\"><code>SELECT object_name, object_type, status FROM dba_objects WHERE owner = 'DDLTEST_TGT' AND object_name = 'CUSTOMERS_V';\n\nOBJECT_NAME    OBJECT_TYPE  STATUS\n-------------- ------------ -------\nCUSTOMERS_V    VIEW         INVALID<\/code><\/pre><\/div><p>There is no built-in GoldenGate mechanism for cascading DDL effects. You must either manage dependent objects manually, or filter the <code>DROP<\/code> and handle cleanup separately.<\/p><\/div>\n\n\n\n<h2 id=\"complete-parameter-file-examples\" class=\"wp-block-heading\">Complete Parameter File Examples<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Here is an example of an extract\/replicat pair, and how you could build complex DDL handling.<\/p>\n\n\n\n<div class=\"proof-block\"><div class=\"code-block-wrapper\"><pre tabindex=\"0\" data-language=\"text\"><code>EXTRACT EXT\nUSERIDALIAS source_cdb DOMAIN OracleGoldenGate\nEXTTRAIL pdb1\/aa\nSOURCECATALOG PDB1\n\n-- Capture structural DDL on mapped objects, exclude storage directives,\n-- and also capture DDL on a shared utility schema not in the TABLE list\nDDL INCLUDE MAPPED, OBJTYPE 'TABLE', OPTYPE CREATE &amp;\n    INCLUDE MAPPED, OBJTYPE 'TABLE', OPTYPE ALTER &amp;\n    INCLUDE MAPPED, OBJTYPE 'TABLE', OPTYPE RENAME &amp;\n    INCLUDE MAPPED, OBJTYPE 'SEQUENCE', OPTYPE CREATE &amp;\n    INCLUDE MAPPED, OBJTYPE 'SEQUENCE', OPTYPE ALTER &amp;\n    EXCLUDE MAPPED, INSTR 'NOLOGGING' &amp;\n    EXCLUDE MAPPED, INSTR 'COMPRESS' &amp;\n    INCLUDE UNMAPPED, OBJNAME SHARED_SCHEMA.*, OBJTYPE 'TABLE', OPTYPE CREATE &amp;\n    INCLUDE UNMAPPED, OBJNAME SHARED_SCHEMA.*, OBJTYPE 'TABLE', OPTYPE ALTER\n\n-- Write DDL activity to the report file for auditing\nDDLOPTIONS REPORT\n\nTABLE APP_SCHEMA.*;\nTABLE SHARED_SCHEMA.*;<\/code><\/pre><\/div><\/div>\n\n\n\n<div class=\"proof-block\"><div class=\"code-block-wrapper\"><pre tabindex=\"0\" data-language=\"text\"><code>REPLICAT REP\nUSERIDALIAS target_db DOMAIN OracleGoldenGate\n\n-- Apply only CREATE and ALTER TABLE on mapped objects, plus shared-schema DDL;\n-- skip sequences, drops, truncates, etc.\nDDL INCLUDE MAPPED, OBJTYPE 'TABLE', OPTYPE CREATE &amp;\n    INCLUDE MAPPED, OBJTYPE 'TABLE', OPTYPE ALTER &amp;\n    INCLUDE MAPPED, OBJNAME SHARED_SCHEMA.*\n\n-- Write DDL activity to report file\nDDLOPTIONS REPORT\n\n-- Write discarded\/failed DDL to discard file rather than abending\nDDLERROR DEFAULT DISCARD\n\nMAP APP_SCHEMA.*, TARGET TARGET_SCHEMA.*;\nMAP SHARED_SCHEMA.*, TARGET SHARED_SCHEMA.*;<\/code><\/pre><\/div><\/div>\n\n\n\n<h2 id=\"summary\" class=\"wp-block-heading\">Summary<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">DDL filtering in GoldenGate is a layered system:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Scope<\/strong> (<code>MAPPED<\/code>\/<code>UNMAPPED<\/code>\/<code>OTHER<\/code>\/<code>ALL<\/code>) restricts DDL replication, based on your <code>TABLE\/MAP<\/code> configuration<\/li>\n\n\n\n<li><strong>Filter keywords<\/strong> (<code>OBJTYPE<\/code>, <code>OPTYPE<\/code>, <code>OBJNAME<\/code>, <code>INSTR<\/code>, <code>INSTRWORDS<\/code>) restricts DDL replication within the scope<\/li>\n\n\n\n<li><strong>Only one <code>DDL<\/code> parameter is allowed per parameter file<\/strong>, but it can carry multiple <code>INCLUDE<\/code>\/<code>EXCLUDE<\/code> clauses continued with <code>&amp;<\/code>. <strong><code>AND<\/code> logic<\/strong> applies within a single clause, while <strong><code>OR<\/code> logic<\/strong> applies across clauses. <strong><code>EXCLUDE<\/code> always wins<\/strong> over <code>INCLUDE<\/code> and always needs a corresponding <code>INCLUDE<\/code><\/li>\n\n\n\n<li><strong><code>DDLOPTIONS<\/code><\/strong> controls what happens when DDL is captured or replicated.<\/li>\n\n\n\n<li><strong>Extract filtering is irreversible<\/strong>. You should filter at the replicat level when multiple replicats need different DDL settings.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>When replicating data with GoldenGate, you often want DDL changes (table alterations, new tables, dropped indexes, etc.) to follow alongside DML. But replicating all DDL is sometimes dangerous (TRUNCATE, DROP TABLE) or simply impossible (architecture differences between source and target). DDL filtering gives you precise control over this. This blog covers multiple aspects, including latest [&hellip;]<\/p>\n","protected":false},"author":152,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":"","_members_access_role":[],"_members_access_error":""},"categories":[1],"tags":[3827,3804,4220,3781,4219,328,3730,96,3976],"type_dbi":[3828,3823,4221,3785,4222,3740,3881,2728,3977],"class_list":["post-46803","post","type-post","status-publish","format-standard","hentry","category-non-classifiee","tag-3827","tag-26ai","tag-ddl","tag-extract","tag-filtering","tag-goldengate","tag-ogg","tag-oracle","tag-replicat","type-3828","type-26ai","type-ddl","type-extract","type-filtering","type-goldengate","type-ogg","type-oracle","type-replicat"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v28.5 (Yoast SEO v28.5) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>DDL Filtering in GoldenGate Extract and Replicat - dbi Blog<\/title>\n<meta name=\"description\" content=\"How to filter DDL replication in GoldenGate Extract and Replicat, covering scopes, filter keywords, and the DDLOPTIONS parameter.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.dbi-services.com\/blog\/ddl-filtering-in-goldengate-extract-and-replicat\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"DDL Filtering in GoldenGate Extract and Replicat\" \/>\n<meta property=\"og:description\" content=\"How to filter DDL replication in GoldenGate Extract and Replicat, covering scopes, filter keywords, and the DDLOPTIONS parameter.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.dbi-services.com\/blog\/ddl-filtering-in-goldengate-extract-and-replicat\/\" \/>\n<meta property=\"og:site_name\" content=\"dbi Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-21T07:11:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-09-21T07:17:35+00:00\" \/>\n<meta name=\"author\" content=\"Julien Delattre\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Julien Delattre\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"9 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/ddl-filtering-in-goldengate-extract-and-replicat\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/ddl-filtering-in-goldengate-extract-and-replicat\\\/\"},\"author\":{\"name\":\"Julien Delattre\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/764ab019cc9dec42655b4c6b9b8e474e\"},\"headline\":\"DDL Filtering in GoldenGate Extract and Replicat\",\"datePublished\":\"2026-09-21T07:11:00+00:00\",\"dateModified\":\"2026-09-21T07:17:35+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/ddl-filtering-in-goldengate-extract-and-replicat\\\/\"},\"wordCount\":1835,\"commentCount\":0,\"keywords\":[\"26\",\"26ai\",\"ddl\",\"extract\",\"filtering\",\"GoldenGate\",\"ogg\",\"Oracle\",\"replicat\"],\"articleSection\":[\"Non classifi\u00e9(e)\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/ddl-filtering-in-goldengate-extract-and-replicat\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/ddl-filtering-in-goldengate-extract-and-replicat\\\/\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/ddl-filtering-in-goldengate-extract-and-replicat\\\/\",\"name\":\"DDL Filtering in GoldenGate Extract and Replicat - dbi Blog\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\"},\"datePublished\":\"2026-09-21T07:11:00+00:00\",\"dateModified\":\"2026-09-21T07:17:35+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/764ab019cc9dec42655b4c6b9b8e474e\"},\"description\":\"How to filter DDL replication in GoldenGate Extract and Replicat, covering scopes, filter keywords, and the DDLOPTIONS parameter.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/ddl-filtering-in-goldengate-extract-and-replicat\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/ddl-filtering-in-goldengate-extract-and-replicat\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/ddl-filtering-in-goldengate-extract-and-replicat\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"DDL Filtering in GoldenGate Extract and Replicat\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/\",\"name\":\"dbi Blog\",\"description\":\"\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/#\\\/schema\\\/person\\\/764ab019cc9dec42655b4c6b9b8e474e\",\"name\":\"Julien Delattre\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a97d00e680bbf237126e24b65281cbcb66cd20bd1ed2d14bf928991b2bf68eb5?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a97d00e680bbf237126e24b65281cbcb66cd20bd1ed2d14bf928991b2bf68eb5?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/a97d00e680bbf237126e24b65281cbcb66cd20bd1ed2d14bf928991b2bf68eb5?s=96&d=mm&r=g\",\"caption\":\"Julien Delattre\"},\"url\":\"https:\\\/\\\/www.dbi-services.com\\\/blog\\\/author\\\/juliendelattre\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"DDL Filtering in GoldenGate Extract and Replicat - dbi Blog","description":"How to filter DDL replication in GoldenGate Extract and Replicat, covering scopes, filter keywords, and the DDLOPTIONS parameter.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.dbi-services.com\/blog\/ddl-filtering-in-goldengate-extract-and-replicat\/","og_locale":"en_US","og_type":"article","og_title":"DDL Filtering in GoldenGate Extract and Replicat","og_description":"How to filter DDL replication in GoldenGate Extract and Replicat, covering scopes, filter keywords, and the DDLOPTIONS parameter.","og_url":"https:\/\/www.dbi-services.com\/blog\/ddl-filtering-in-goldengate-extract-and-replicat\/","og_site_name":"dbi Blog","article_published_time":"2026-09-21T07:11:00+00:00","article_modified_time":"2026-09-21T07:17:35+00:00","author":"Julien Delattre","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Julien Delattre","Est. reading time":"9 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.dbi-services.com\/blog\/ddl-filtering-in-goldengate-extract-and-replicat\/#article","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/ddl-filtering-in-goldengate-extract-and-replicat\/"},"author":{"name":"Julien Delattre","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/764ab019cc9dec42655b4c6b9b8e474e"},"headline":"DDL Filtering in GoldenGate Extract and Replicat","datePublished":"2026-09-21T07:11:00+00:00","dateModified":"2026-09-21T07:17:35+00:00","mainEntityOfPage":{"@id":"https:\/\/www.dbi-services.com\/blog\/ddl-filtering-in-goldengate-extract-and-replicat\/"},"wordCount":1835,"commentCount":0,"keywords":["26","26ai","ddl","extract","filtering","GoldenGate","ogg","Oracle","replicat"],"articleSection":["Non classifi\u00e9(e)"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.dbi-services.com\/blog\/ddl-filtering-in-goldengate-extract-and-replicat\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.dbi-services.com\/blog\/ddl-filtering-in-goldengate-extract-and-replicat\/","url":"https:\/\/www.dbi-services.com\/blog\/ddl-filtering-in-goldengate-extract-and-replicat\/","name":"DDL Filtering in GoldenGate Extract and Replicat - dbi Blog","isPartOf":{"@id":"https:\/\/www.dbi-services.com\/blog\/#website"},"datePublished":"2026-09-21T07:11:00+00:00","dateModified":"2026-09-21T07:17:35+00:00","author":{"@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/764ab019cc9dec42655b4c6b9b8e474e"},"description":"How to filter DDL replication in GoldenGate Extract and Replicat, covering scopes, filter keywords, and the DDLOPTIONS parameter.","breadcrumb":{"@id":"https:\/\/www.dbi-services.com\/blog\/ddl-filtering-in-goldengate-extract-and-replicat\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.dbi-services.com\/blog\/ddl-filtering-in-goldengate-extract-and-replicat\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.dbi-services.com\/blog\/ddl-filtering-in-goldengate-extract-and-replicat\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"https:\/\/www.dbi-services.com\/blog\/"},{"@type":"ListItem","position":2,"name":"DDL Filtering in GoldenGate Extract and Replicat"}]},{"@type":"WebSite","@id":"https:\/\/www.dbi-services.com\/blog\/#website","url":"https:\/\/www.dbi-services.com\/blog\/","name":"dbi Blog","description":"","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.dbi-services.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Person","@id":"https:\/\/www.dbi-services.com\/blog\/#\/schema\/person\/764ab019cc9dec42655b4c6b9b8e474e","name":"Julien Delattre","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/a97d00e680bbf237126e24b65281cbcb66cd20bd1ed2d14bf928991b2bf68eb5?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/a97d00e680bbf237126e24b65281cbcb66cd20bd1ed2d14bf928991b2bf68eb5?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a97d00e680bbf237126e24b65281cbcb66cd20bd1ed2d14bf928991b2bf68eb5?s=96&d=mm&r=g","caption":"Julien Delattre"},"url":"https:\/\/www.dbi-services.com\/blog\/author\/juliendelattre\/"}]}},"_links":{"self":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/46803","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/users\/152"}],"replies":[{"embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/comments?post=46803"}],"version-history":[{"count":9,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/46803\/revisions"}],"predecessor-version":[{"id":47027,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/posts\/46803\/revisions\/47027"}],"wp:attachment":[{"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/media?parent=46803"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/categories?post=46803"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/tags?post=46803"},{"taxonomy":"type","embeddable":true,"href":"https:\/\/www.dbi-services.com\/blog\/wp-json\/wp\/v2\/type_dbi?post=46803"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}