- #1
Konu Sahibi
: serkankacan
[YÖNETİCİ REHBERİ] vSRO Genel İtem Silme (Çanta, Kasa, Pet ve Veritabanı Temizliği)
_Inventory, _Chest, _GuildChest, _InvCOS Yuvalarını Sıfırlama ve _Items Tablosundan Yetim Kayıtları Silme
_Inventory, _Chest, _GuildChest, _InvCOS Yuvalarını Sıfırlama ve _Items Tablosundan Yetim Kayıtları Silme
Merhaba değerli forum sakinleri,
Sunucunuzda hatalı basılan, dupe edilen veya tamamen oyundan kaldırmak istediğiniz herhangi bir eşyayı tüm oyuncuların çantasından, kişisel kasalarından, klan (Guild) kasalarından ve binek/toplayıcı hayvan (Pet - COS) çantalarından tek bir sorgu ile kalıcı olarak silebilirsiniz.
Aşağıda paylaşılan optimize sorgu; yuvaları sıfırlamakla kalmaz,
_Items tablosundaki artık (yetim) kayıtları da fiziksel olarak temizleyerek veritabanınızın şişmesini engeller.Kritik Güvenlik Uyarısı' Alıntı:DİKKAT:
- Bu sorgu çalıştırılmadan önce GameServer ve ShardManager modüllerinin kapalı olması (veya sunucunun bakım modunda olması) şiddetle önerilir. Karakterler oyundayken envanter tabloları güncellenirse, oyuncular oyundan çıkış yaparken belleklerindeki eski veriyi DB'ye tekrar yazabilirler.
- İşlem öncesinde mutlaka SRO_VT_SHARD yedeğinizi alınız.
Optimize Edilmiş & Tam Temizlik Yapan SQL Query Kodu
SQL:
USE [SRO_VT_SHARD]
GO
-- ===================================================================
-- 1. ADIM: SİLİNECEK EŞYANIN KOD ADI
-- ===================================================================
DECLARE @codename128 VARCHAR(128) = 'ITEM KODUNU BURAYA YAZINIZ' -- Örn: ITEM_ETC_ARCHEMY_MAGICSTONE_ASTRAL_11
-- Eşyanın ID bilgisini alıyoruz
DECLARE @RefItemID INT = (SELECT ID FROM dbo._RefObjCommon WITH (NOLOCK) WHERE CodeName128 = @codename128)
IF (@RefItemID IS NULL)
BEGIN
RAISERROR('HATA: Belirtilen eşya kodu (_RefObjCommon) veritabanında bulunamadı!', 16, 1)
RETURN
END
-- ===================================================================
-- 2. ADIM: SİLİNECEK EŞYALARI BELİRLEME (PERFORMANS İÇİN)
-- ===================================================================
DECLARE @DeletedItems TABLE (ItemID64 BIGINT PRIMARY KEY)
INSERT INTO @DeletedItems (ItemID64)
SELECT ID64
FROM dbo._Items WITH (NOLOCK)
WHERE RefItemID = @RefItemID
-- ===================================================================
-- 3. ADIM: YUVALARI SIFIRLAMA (ItemID = 0)
-- ===================================================================
-- 3.1. Oyuncu Çantaları (_Inventory)
UPDATE INV
SET INV.ItemID = 0
FROM dbo._Inventory INV
INNER JOIN @DeletedItems D ON D.ItemID64 = INV.ItemID
-- 3.2. Banka / Kişisel Kasalar (_Chest)
UPDATE CH
SET CH.ItemID = 0
FROM dbo._Chest CH
INNER JOIN @DeletedItems D ON D.ItemID64 = CH.ItemID
-- 3.3. Guild Kasaları (_GuildChest)
UPDATE GCH
SET GCH.ItemID = 0
FROM dbo._GuildChest GCH
INNER JOIN @DeletedItems D ON D.ItemID64 = GCH.ItemID
-- 3.4. Binek ve Toplayıcı Hayvan Çantaları (_InvCOS)
UPDATE COS
SET COS.ItemID = 0
FROM dbo._InvCOS COS
INNER JOIN @DeletedItems D ON D.ItemID64 = COS.ItemID
-- ===================================================================
-- 4. ADIM: _Items TABLOSUNDAKİ ARTIK KAYITLARI SİLME
-- ===================================================================
DELETE IT
FROM dbo._Items IT
INNER JOIN @DeletedItems D ON D.ItemID64 = IT.ID64
PRINT '====================================================='
PRINT 'BAŞARILI: ' + @codename128 + ' eşyası tüm envanterlerden ve veritabanından temizlendi!'
PRINT 'Silinen toplam nesne adedi: ' + CAST((SELECT COUNT(*) FROM @DeletedItems) AS VARCHAR(10))
PRINT '====================================================='
Neden Bu Optimize Yapı Kullanılmalı?
- Artık (Orphan) Kayıt Kalmaz: Standart kodlarda sadece yuvalar `0` yapılırken, bu sorgu eşyanın `_Items` tablosundaki asıl satırını da silerek veri kirliliğini engeller.
- Hızlı ve Güvenli: Dört ayrı güncelleme sorgusunda tek tek `JOIN` ile indeks taraması yapmak yerine `ID64` listesi geçici hafızada toplanır; sorgu saniyeler içinde tamamlanır.
- Raporlama: İşlem bittiğinde Messages sekmesinde sunucudan toplam kaç adet eşyanın silindiğini net olarak gösterir.
Nasıl Uygulanır?
- SQL Server Management Studio (SSMS) programını açın.
- Üst kısımdan New Query penceresi açın.
- Yukarıdaki SQL kodunu yapıştırın ve
@codename128alanına silmek istediğiniz eşyanın kodunu yazın. - F5 tuşuna basarak çalıştırın.
- Sunucu modüllerinizi yeniden başlatın.
Sorularınızı ve takıldığınız yerleri bu konu altından iletebilirsiniz. Herkese keyifli geliştirmeler!

