Yaratılan Tablolara Otomatik Alan Ekleme
Daha sonra bu olayı SCHEMA TRIGGERLARI adı altında daha detaylı inceleyebiliriz ama şimdi birebir çözüm olduğu bir olaydan bahsetmek istiyorum. Şu anda üzerinde çalıştığımız projede ODS olarak kullanmak üzere GoldenGate ile veritabanının birebir kopyasını oluşturuyoruz. Operasyonel veritabanından yapısal olarak en önemli farkı her tablonun ekstra olarak ilgili satırın son gördüğü işlem tipini(INSERT, UPDATE) ve işlem zamanını saklayan iki kolona sahip olması.
Sorun : Goldengate parametrelerinde hedefte bu iki ekstra kolonun da bulunduğu şekilde tanım yapılmış olmasına rağmen kaynak veritabanındaki bir tablo DROP, CREATE işlemine uğrayınca veya yeni bir tablo CREATE edilince hedefte oluşan tabloda bu iki ekstra kolon oluşmuyor ve GOLDENGATE mapping yüzünden hata veriyor. Bir süre bu sorunu her bu tip değişiklik olduğunda elle ilgili alanları yaratarak aştık ama nereye kadar, bu arada goldengate’in durduğunu da hesaba katarsak bize daha kullanışlı bir çözüm gerekti.
Çözüm : Şema bazında yaratılacak bir AFTER CREATE ON SCHEMA triggerla çalışan her ddl den sonra eğer bu bir CREATE işlemiyse triggera düşüyor ve biz de trigger içinde ora_dict_obj_type değerine bakarak bunun bir table creati olup olmadığına bakıyoruz ve eğer create table işlemiyse ilgili alanları ora_dict_obj_name’den ismini aldığımız tabloya ekliyoruz.
CREATE OR REPLACE TRIGGER ODS.DEF_OT_TS_EKLE AFTER CREATE ON SCHEMA DECLARE l_sysevent varchar2(25); l_Obje_Name varchar2(30); l_Obje_Type varchar2(30); OTekleSQL varchar2(400); TSekleSQL varchar2(400); begin select ora_sysevent into l_sysevent from dual;
select ora_sysevent, ora_dict_obj_name, ora_dict_obj_type into l_sysevent, l_Obje_Name, l_Obje_Type from dual;
if ( l_Obje_Type in (‘TABLE’) ) then TSekleSQL := ‘ALTER TABLE ‘||l_Obje_Name||’ ADD TS TIMESTAMP(6)’; OTekleSQL := ‘ALTER TABLE ‘||l_Obje_Name||’ ADD OT VARCHAR2(20 BYTE)’; EXECUTE IMMEDIATE TSekleSQL; EXECUTE IMMEDIATE OTekleSQL; end if; end;
