{"id":3762,"date":"2014-06-04T12:39:53","date_gmt":"2014-06-04T17:39:53","guid":{"rendered":"http:\/\/appcrawler.com\/wordpress\/?p=3762"},"modified":"2014-06-04T12:39:53","modified_gmt":"2014-06-04T17:39:53","slug":"programatically-creating-goldengate-conflict-detectionresolution-rules","status":"publish","type":"post","link":"http:\/\/appcrawler.com\/wordpress\/2014\/06\/04\/programatically-creating-goldengate-conflict-detectionresolution-rules\/","title":{"rendered":"Programatically creating GoldenGate conflict detection\/resolution rules"},"content":{"rendered":"<p>We initially started with checking all columns in every table for any differences in an active-active environment, and aborting the replicat if it failed.  That seems a bit over the top in hindsight, so we changed it to simply discard the offending record and wrote a job to alert on this event.<\/p>\n<p>We used what is below to programatically create the GoldenGate mapping file.  It is pretty useful, so just edit it for your needs.<\/p>\n<pre lang=\"plsql\">\r\nset lines 1000 trims on verify off feedback off\r\nset serveroutput on\r\nspool cols.out\r\ndeclare\r\n  l_owner varchar2(30) := upper('&owner');\r\n  type t_keys is table of varchar2(30);\r\n  keys t_keys := t_keys();\r\n  j number := 1;\r\nbegin\r\n  for tab in (select distinct table_name from dba_tab_columns where data_type like '%LOB' and owner = l_owner) loop\r\n    for r in (select column_name from dba_tab_columns where data_type like '%LOB' and owner = l_owner and table_name = tab.table_name) loop\r\n      keys.extend(1);\r\n      keys(j) := r.column_name;\r\n      j := j + 1;\r\n    end loop;\r\n    j := 1;\r\n    dbms_output.put_line('map ' || l_owner || '.' || tab.table_name || ', target ' || l_owner || '_rep.' || tab.table_name || ', & ');\r\n    for j in 1..keys.count loop\r\n      if j = keys.count then\r\n        if j = 1 then\r\n          dbms_output.put_line('COMPARECOLS (ON UPDATE ALLEXCLUDING (' || keys(j) || ')), & ');\r\n        else\r\n          dbms_output.put_line(',' || keys(j) || ')) & ');\r\n        end if;\r\n      elsif j = 1 then\r\n        dbms_output.put('COMPARECOLS (ON UPDATE ALLEXCLUDING (' || keys(j));\r\n      else\r\n        dbms_output.put(',' || keys(j));\r\n      end if;\r\n    end loop;\r\n    keys.delete();\r\n    dbms_output.put_line('RESOLVECONFLICT (UPDATEROWMISSING, (DEFAULT, DISCARD));');\r\n    --dbms_output.put_line('RESOLVECONFLICT (UPDATEROWEXISTS, (DEFAULT, DISCARD));');\r\n    dbms_output.put_line(rpad('-',100,'-'));\r\n  end loop;\r\n  for tab in (select table_name from dba_tables where owner = l_owner and table_name not in\r\n               (select distinct table_name from dba_tab_columns where data_type like '%LOB' and owner = l_owner)) loop\r\n    dbms_output.put_line('map ' || l_owner || '.' || tab.table_name || ', target ' || l_owner || '_rep.' || tab.table_name || ', COMPARECOLS (ON UPDATE ALL), & ');\r\n    dbms_output.put_line('RESOLVECONFLICT (UPDATEROWMISSING, (DEFAULT, DISCARD));');\r\n    --dbms_output.put_line('RESOLVECONFLICT (UPDATEROWEXISTS, (DEFAULT, DISCARD));');\r\n    dbms_output.put_line(rpad('-',100,'-'));\r\n  end loop;\r\nend;\r\n\/\r\n<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>We initially started with checking all columns in every table for any differences in an active-active environment, and aborting the replicat if it failed. That seems a bit over the top in hindsight, so we changed it to simply discard&hellip;<\/p>\n<p class=\"more-link-p\"><a class=\"more-link\" href=\"http:\/\/appcrawler.com\/wordpress\/2014\/06\/04\/programatically-creating-goldengate-conflict-detectionresolution-rules\/\">Read more &rarr;<\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_mi_skip_tracking":false,"footnotes":""},"categories":[19,35,29],"tags":[],"_links":{"self":[{"href":"http:\/\/appcrawler.com\/wordpress\/wp-json\/wp\/v2\/posts\/3762"}],"collection":[{"href":"http:\/\/appcrawler.com\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/appcrawler.com\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/appcrawler.com\/wordpress\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/appcrawler.com\/wordpress\/wp-json\/wp\/v2\/comments?post=3762"}],"version-history":[{"count":3,"href":"http:\/\/appcrawler.com\/wordpress\/wp-json\/wp\/v2\/posts\/3762\/revisions"}],"predecessor-version":[{"id":3765,"href":"http:\/\/appcrawler.com\/wordpress\/wp-json\/wp\/v2\/posts\/3762\/revisions\/3765"}],"wp:attachment":[{"href":"http:\/\/appcrawler.com\/wordpress\/wp-json\/wp\/v2\/media?parent=3762"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/appcrawler.com\/wordpress\/wp-json\/wp\/v2\/categories?post=3762"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/appcrawler.com\/wordpress\/wp-json\/wp\/v2\/tags?post=3762"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}