- #1
Konu Sahibi
: serkankacan
[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
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ı?
- 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.
- 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.
- 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?
- Silmek istediğiniz karakterin oyunda olmadığından emin olun (Offline).
- SQL Server Management Studio (SSMS) programını açıp New Query deyin.
- Yukarıdaki kodu yapıştırın ve en üstteki
@CharName = 'CharAdıYaz'alanını silinecek nick ile değiştirin. - F5 tuşuna basarak sorguyu çalıştırın.
- 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!

