1

Konu: SQL recovery model-Full

Selamlar;
MS SQL de dbf de olduğu silinen satırları geri getirmek yok diye biliyordum. ancak bir arkadaşım MS SQL Database den "Recovery model" Full yapınce gelir dedi. Database şuan Full durumda.
Silnen bilgileri nasıl görebilirim.
Yada gereçekten bu şekildemi kullanılmalı.

Bilmediğin Neyse Yanıldığındır.

2 Son düzenleyen, ugurlu2001 (14.08.2009 13:48:37)

Re: SQL recovery model-Full

Ramazan;

Recovery mantığını; aldığın yedeği geri yüklemek diye düşün. SQL Server da; VFP de olduğu gibi bir recall mantığı yok, Yedek dosyanı ayrı bir SQL oturumunda açıp, silinen kayıtları Inser Into ... Select .... biçiminde geri getirebilirsin.

Eğer Delete ,  Insert, Update Triggerlarını  kullanıyorsan (Ki kullanmanı öneriririm.) ; Ayrı LOG Table 'larıı oluşturup, işlem gören tüm kayıtları ( Delete - Update )  bu log Table larında saklayabilirsin. Burada iş tamamen programcıya ve onun mantığına kalmış; İyi analiz edilmiş bir sistemde ben bunun olması gerektiğini düşünüyorum.  Yani her bir table için, tüm silme - güncelleme işlemlerinde  ayrı bir Log_Table.

Birde silinen kayıtları gerçekten de silmeyip VFP mantığı ile işaretleyebilirsin. Mesela IsRowDeleted gibi bir sütunu TRUE yapıp, VIEW ve STORED procedurlarında buna göre hesaplama yaptırırsın. Böylece en azından silinen kayıt göz önünde alur ama aynı kayıt defalarca silinip tekrar geri alınırsa gerçek bir loglama olmaz. Bu yöntemi tavsiye etmem.

Eğer çok büyük miktarda datan yoksa,  ve günlük düzenli yedek alıyorsan, fazla önemseme. Bu tip geri yüklemeler nadiren oluyorsa backuplardan yükleme yap.

Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü

3

Re: SQL recovery model-Full

http://www.fox4um.com/post/5384/#p5384
linkteki gibi SQL de log tutuyorum. buna ek olarak duşında değişiklikkaydı için.

SQL
*DegisenKaydet('adet')

FUNCTION DegisenKaydet
Lparameters lctable
IF !Empty(lctable)
    SELECT (lctable)
    LOCAL lnfield,lcfieldname,lcchanges1,LcWka_partno,LcTableGuid
    LcTableGuidx='&lctable'+'.guid'
    LcTableGuid=&LcTableGuidx
    IF Len(Alltrim(LcTableGuid))=0
        LcTableGuid=NULL
    Endif
    lcchanges1 =""
    LcWka_partno=''
    FOR lnfield = 1 TO Fcount()
        lcfieldname = FIELD(lnfield)
        IF Upper(Alltrim(lcfieldname))=='WKA_PARTNO'
            LcWka_partno=Alltrim(Transform(Eval(lcfieldname)))
        ENDIF
        IF Transform(Oldval(lcfieldname))<>Transform(Eval(lcfieldname))
            lcchanges1 = lcchanges1 + lcfieldname + ": ";
                + Alltrim(Transform(Oldval(lcfieldname))) + " -> ";
                + Alltrim(Transform(Eval(lcfieldname)));
                + Chr(13) + Chr(10)
        Endif
    Next
    IF Len(Alltrim(lcchanges1))>0
        IF !Empty(LcWka_partno)
            m.lcchanges1=M.lcchanges1+ " ->> "+LcWka_partno
        Endif
        LOCAL Lccode1
        Lccode1=M.lcchanges1
        Lcsorgu1=''
        Lcsorgu1=Lcsorgu1+"declare @LcCode nchar (2000),@LcTableAdi nchar (50),@LcTableGuid1 uniqueidentifier "+Chr(13)
        Lcsorgu1=Lcsorgu1+"select @LcCode='"+Lccode1+"'"+Chr(13)
        Lcsorgu1=Lcsorgu1+"select @LcTableAdi ='"+lctable+"'"+Chr(13)
        Lcsorgu1=Lcsorgu1+"select @LcTableGuid1='"+LcTableGuid+"'"+Chr(13)
        TEXT TO Lcsorgu TEXTMERGE noshow
INSERT INTO wka2009.dbo.anadosya (tableadi,icerik,tip,guid1) VALUES (@LcTableAdi,@Lccode,'detay',@LcTableGuid1)
        ENDTEXT
        lcsorgu=Lcsorgu1+lcsorgu
*        SorguGoster(lcsorgu)
        mysqlexec(baglan(),m.lcsorgu)
    Endif
Endif
Endfunc


bunu kullanıyorum.
Oldukça işime yarıyor.

Recovery mod ile geri yüklemeden silinenleri göremiyeceksem. şuan yapmayı planladığım şey  IsRowDeleted kolonu yerine 2 kolonlu 1 table da tableadi ve detaysorgu gibi açıp, detaysorgu ya silinen satır ın insert ile eklenebilecek sql querysini koymayı düşiünüyorum?

Bilmediğin Neyse Yanıldığındır.

4 Son düzenleyen, ugurlu2001 (15.08.2009 12:37:31)

Re: SQL recovery model-Full

Ramazan;

Ben olsam basitçe şöyle bir şey düşünürdüm. ( Sadece fikir jimnastiği açısından söylüyorum )

SQL Serverda, bir oturumda Delete yada Update işlemi yapığında; SQL server otomatik olarak Deleted ve Inserted tablolarını güncelliyor. Deleted işlemi olduğunda sadece DELETED; insert işlemi olduğunda ise hem DELETED hemde INSERTED tabloları güncelleniyor. LOG takibini yapmak istediğin tablonun belirli fieldlarını değilde; tablonun aynısından bir tane Table_Log oluşturduğunda, silinen yada güncellenen kayıtlara ilişkin daha rahat işlem yaparsın.

Musteri Table i için Log olduğunu varsayalım:

SQL
CREATE TABLE MusteriLog

(
Islem char(6),
MusteriNo int,
MusteriAd varchar(200),
Kullanici varchar(100),
Tarih datetime
)
 
 
CREATE TRIGGER tr_MusteriIslem ON Musteri
FOR DELETE, INSERT, UPDATE
AS
begin
    declare @EklenenSayisi int, @SilinenSayisi int
    SELECT @EklenenSayisi = count(*) FROM inserted
    SELECT @SilinenSayisi  = count(*) FROM deleted
 
    IF(@EklenenSayisi = 0 AND @SilinenSayisi <> 0)
    INSERT MusteriLog
    SELECT     'delete', MusteriNo, MusteriAd, suser_sname(), getdate() FROM deleted
 
    else IF(@EklenenSayisi <> 0 AND @SilinenSayisi = 0)
    INSERT MusteriLog
    SELECT     'insert', MusteriNo, MusteriAd, suser_sname(), getdate() FROM inserted
    else
    begin
        IF (NOT UPDATE(MusteriNo))
        begin
            INSERT MusteriLog
            SELECT     'update', i.MusteriNo,
            'Eski ad: ' + d.MusteriAd + ' Yeni ad: ' + i.MusteriAd,
            suser_sname(), getdate()
            FROM inserted i
            JOIN deleted d ON i.MusteriNo = d.MusteriNo   
        end
        else
        INSERT MusteriLog
        SELECT     'update', MusteriNo, MusteriAd, suser_sname(), getdate()
        FROM inserted           
    end
end

( C ve System programcıları Derneği. Hüseyin Bute ders notu. )

Akabinde;

SQL
SELECT * FROM Musteri_Log WHERE  Islem = 'deleted' -- yada ne istiyorsan.
Uğur
-------------------------------------------------------------------------------------------------------------
Hayat bir bisiklete binmek gibidir. Pedalı çevirmeye devam ettiğiniz sürece düşmezsiniz. Claude Peppeer
Kusuru söylenmeyen adam, ayıbını hüner sanır.  Türk Atasözü