İçeriğe geç
Türkiye'nin SRO tanıtım & topluluk platformu

vSro Paylaşım vSRO Tek Karakteri Veritabanından Kalıcı Olarak Silme (Full Wipe)

Cevaplar0
Görüntüleme4
Ticaret Puanı
0
Katılım
8 Eyl 2026
Mesajlar
88
Tepkime puanı
1
Puanları
0
Mevcut Bakiye
2960 ₺
[YÖNETİCİ REHBERİ] vSRO Tek Karakteri Veritabanından Kalıcı Olarak Silme (Full Wipe)
Foreign Key Çakışmalarını Önleyerek Eşyaları, Skilleri, Petleri ve Tüm Bağlantıları Eksiksiz Temizleme



Merhaba değerli forum sakinleri,

Test aşamalarında çöken, buga giren veya tamamen sunucudan temizlemek istediğiniz bir karakteri silmeye çalıştığınızda genellikle **Foreign Key Constraint (İlişkisel Anahtar Hatası)** ile karşılaşırsınız.

İnternette dolaşan eski sorgularda sadece 4-5 tablo silindiği için `_Items` tablosunda yetim eşyalar kalır, karakterin petleri (`_CharCOS`), görevleri (`_CharQuest`), arkadaş listesi (`_Friend`) ve posta kayıtları (`_Memo`) silinmediği için veritabanında şişme ve hatalar meydana gelir.

Aşağıdaki sorgu, bir karaktere bağlı olan istisnasız tüm alt verileri (çantasındaki itemlerin `_Items` fiziksel kayıtları dahil) doğru sırayla ve güvenle temizler.

Kritik Güvenlik Uyarısı' Alıntı:
DİKKAT (Geri Döndürülemez İşlem):
  • Bu işlem geri alınamaz! Karakter tamamen veritabanından silinir.
  • Silinecek karakterin kesinlikle oyunda olmaması (Offline) zorunludur.
  • Eğer karakter bir klanın (Guild) başkanı (Master) ise, silmeden önce klanı oyundan dağıtmanız veya masterlığı devretmeniz önerilir.
  • İşlem öncesinde mutlaka SRO_VT_SHARD yedeğinizi alınız.



Hatasız & Eksiksiz SQL Karakter Silme Sorgusu

SQL:
USE [SRO_VT_SHARD]
GO

-- ===================================================================
-- SİLİNECEK KARAKTERİN ADI
-- ===================================================================
DECLARE @CharName VARCHAR(16) = 'CharAdıYaz' -- Buraya silmek istediğiniz karakter adını yazın

DECLARE @CharID INT = (SELECT CharID FROM dbo._Char WITH (NOLOCK) WHERE CharName16 = @CharName)

IF (@CharID IS NULL)
BEGIN
    RAISERROR('HATA: Belirtilen karakter veritabanında bulunamadı!', 16, 1)
    RETURN
END

BEGIN TRANSACTION
BEGIN TRY

    -- 1. Karakterin Çantasındaki ve Avatar Slotlarındaki Eşyaların ItemID64 Listesini Topla
    DECLARE @UserItems TABLE (ItemID64 BIGINT)

    INSERT INTO @UserItems (ItemID64)
    SELECT ItemID FROM dbo._Inventory WHERE CharID = @CharID AND ItemID > 0
    UNION
    SELECT ItemID FROM dbo._InventoryForAvatar WHERE CharID = @CharID AND ItemID > 0

    -- 2. Envanter Yuvalarını Boşalt
    DELETE FROM dbo._Inventory WHERE CharID = @CharID
    DELETE FROM dbo._InventoryForAvatar WHERE CharID = @CharID

    -- 3. _Items Tablosundaki Fiziksel Eşya Kayıtlarını Temizle (Yetim Kayıt Bırakmaz)
    DELETE I
    FROM dbo._Items I
    INNER JOIN @UserItems U ON I.ID64 = U.ItemID64

    -- 4. Karakterin Binek ve Toplayıcı Petlerini Temizle (COS)
    DELETE FROM dbo._InvCOS WHERE COS_ID IN (SELECT ID FROM dbo._CharCOS WHERE OwnerCharID = @CharID)
    DELETE FROM dbo._CharCOS WHERE OwnerCharID = @CharID

    -- 5. Beceriler ve Ustalıklar (Skill & Mastery)
    DELETE FROM dbo._CharSkill WHERE CharID = @CharID
    DELETE FROM dbo._CharSkillMastery WHERE CharID = @CharID

    -- 6. Görevler ve Koleksiyonlar (Quest)
    DELETE FROM dbo._CharQuest WHERE CharID = @CharID
    DELETE FROM dbo._CharCollectionBook WHERE CharID = @CharID
    DELETE FROM dbo._CharCollectionBookItem WHERE CharID = @CharID

    -- 7. Sosyal Veriler (Arkadaş Listesi, Engellenenler, Posta/Memo)
    DELETE FROM dbo._Friend WHERE CharID = @CharID OR FriendCharID = @CharID
    DELETE FROM dbo._Memo WHERE SenderCharName = @CharName

    -- 8. Meslek, Ceza ve Zamanlı Görevler
    DELETE FROM dbo._CharTrijob WHERE CharID = @CharID
    DELETE FROM dbo._TimedJob WHERE CharID = @CharID
    DELETE FROM dbo._StaticAvatar WHERE CharID = @CharID

    -- 9. Karakter - Kullanıcı Hesabı Eşleştirmesi (_User)
    DELETE FROM dbo._User WHERE CharID = @CharID

    -- 10. Son Olarak Ana Karakter Satırını Sil (_Char)
    DELETE FROM dbo._Char WHERE CharID = @CharID

    COMMIT TRANSACTION
    PRINT '====================================================='
    PRINT 'BAŞARILI: ' + @CharName + ' adlı karakter ve tüm bağlı verileri eksiksiz silindi!'
    PRINT '====================================================='

END TRY
BEGIN CATCH
    ROLLBACK TRANSACTION
    PRINT 'HATA OLUŞTU: Karakter silinemedi! Hata Detayı: ' + ERROR_MESSAGE()
END CATCH



Neden Bu Optimize Yapı Kullanılmalı?

  1. Transaction (İşlem Güvenliği): Kod `BEGIN TRY...CATCH` ve `TRANSACTION` içine alınmıştır. Eğer silme esnasında tek bir tabloda bile hata çıkarsa işlem geri alınır (Rollback) ve veritabanı yarım/çöp halde kalmaz.
  2. Sıfır Yetim Kayıt (Orphan-Free): Karakterin envanterindeki eşyalar `_Items` tablosundan da fiziksel olarak temizlenir; veritabanı şişmesi ve boşa yer kaplaması engellenir.
  3. Pet ve Görev Bütünlüğü: Pet çantaları (`_InvCOS`), aktif görevler (`_CharQuest`) ve arkadaş listesi (`_Friend`) de silindiği için Foreign Key hataları tamamen önlenmiştir.



Nasıl Uygulanır?

  1. Silmek istediğiniz karakterin oyunda olmadığından emin olun (Offline).
  2. SQL Server Management Studio (SSMS) programını açıp New Query deyin.
  3. Yukarıdaki kodu yapıştırın ve en üstteki @CharName = 'CharAdıYaz' alanını silinecek nick ile değiştirin.
  4. F5 tuşuna basarak sorguyu çalıştırın.
  5. Messages sekmesinde BAŞARILI iletisini gördüğünüzde karakter tamamen silinmiş olacaktır.

Sorularınızı ve takıldığınız yerleri konu altından sorabilirsiniz. Herkese keyifli geliştirmeler!
 

Konuyu görüntüleyenler

Yükleniyor...
Yükleniyor...
Şu anda sitemizde 40,340 Aktif Kullanıcı
Çevrimiçi üyeler
Konular 1,311
Mesajlar 4,191
Kullanıcılar 1,624
Son üye mrt
Geri
Üst