Bunun farklı yolları var, bu yolları yazılımcı kendi yöntemleriyle halledebileceği gibi, veritabanı yöneticisi de bir takım tedbirler alabilir.
-Yazılımcı içerisinde pl-sql bulunan prosedür'leri, fonksiyonları yenisi ile değiştirmeden, mevcutunun scriptini alıp, bir yerlerde saklayabilir.
-yine yazılım tarafında bu tarz scriptleri sürüm olarak tutan uygulamalar var. herkesin çok kullandığı TFS üzerinde veya SourceSafe üzerinde tutulabilir. bunlar haricinde farklı 3 party yazılımlar da mevcut. Tüm değişikler, sürüm numaralarıyla saklanabiliyor.
Yazılımcı haricinde veritabanı tarafında veritabanı yöneticisi de bazı önlemler alabilir.
--Örneğin, Oracle'da bulunan datapump ile tüm veritabanının METADATA'sı export edilerek belirli süre(mesela 1 hafta) işletim sistemi üzerinde saklayabilir. ihtiyaç duyulduğu anda istenilen metadata'yı veritabanına import edebilir. Bunu DBA'den isteyebilirsiniz.
-Diğer bir seçenek ise; eğer veritabanında flashback aktif ise, ilgili metadatanın geçmiş hali çekilebilir. Tabiki bu süre kısıtlı ve veritabanındaki ayarlar dahilindedir.
Yazılımcı olarak, eğer veritabanına bağlandığınız kullanıcının yetkisi var ise aşağıdaki örnekte yaptığım gibi procedure'lerinizi fonksiyonlarınızı, package'larınızı kurtarabilirsiniz.
Bir procedure olusturalım.
SQL> CREATE OR REPLACE PROCEDURE P_CUSTOMER
2 AS
3 BEGIN
4 UPDATE customers
5 SET city = 'Istanbul'
6 WHERE city = 'ISTANBUL';
7 END;
8 /
Procedure created.
Procedure'ün scriptini select edelim.
SQL> SELECT TEXT
2 FROM dba_source
3 WHERE NAME = 'P_CUSTOMER';
TEXT
------------------------------------------------------------------------------------------------------------------------------------------------------------------
PROCEDURE P_CUSTOMER
AS
BEGIN
UPDATE customers
SET city = '?stanbul'
WHERE city = 'ISTANBUL';
END;
7 rows selected.
Saati kontrol ediyorum.
SQL> !date
Fri Feb 26 14:00:00 EET 2016
Procedure'ü değiştiriyorum.
SQL> CREATE OR REPLACE PROCEDURE P_CUSTOMER
2 AS
3 BEGIN
4 UPDATE customers
5 SET city = 'Istanbul-Avrupa'
6 WHERE city = 'ISTANBUL';
7 END;
8 /
Procedure created.
Aşağıda görüldüğü gibi procedure değiştiği şekilde.
SQL> SELECT TEXT
2 FROM dba_source
3 WHERE NAME = 'P_CUSTOMER';
TEXT
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
PROCEDURE P_CUSTOMER
AS
BEGIN
UPDATE customers
SET city = 'Istanbul-Avrupa'
WHERE city = 'ISTANBUL';
END;
7 rows selected.
Şimdi procedure'un saat 14:00'daki halini çekelim.
SQL> SELECT TEXT
2 FROM dba_source AS OF TIMESTAMP TO_TIMESTAMP ('26-02-2016 14:00:00', 'DD-MM-YYYY hh24:MI:SS')
3 WHERE NAME = 'P_CUSTOMER';
TEXT
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
PROCEDURE P_CUSTOMER
AS
BEGIN
UPDATE customers
SET city = 'Istanbul'
WHERE city = 'ISTANBUL';
END;
7 rows selected.
Yukarıda gördüğünüz gibi procedure'un öncekini haline ulaştık.
AS OF TIMESTAMP kalıbını tablolar için de kullanabilir. tablonun birkaç saat öncesinde verisi nasıldı öğrenebiliriz mesela. yanlışlıkla ezilen dataları kurtarmak için birebir :)
Bu Oracle'ın Flashback teknolojisinin sunduğu bir güzellik. Daha sonra başka bir başlık altında daha detaylı bilgi verebilirim.