- #1
Konu Sahibi
: serkankacan
[YÖNETİCİ REHBERİ] vSRO Belirli Bir Eşyayı Tüm Oyuncuların Çanta ve Kasalarından Silme
_Inventory, _Chest, _GuildChest, _InvCOS ve _Items Tablolarından Tam Senkronize İtem Temizleme
_Inventory, _Chest, _GuildChest, _InvCOS ve _Items Tablolarından Tam Senkronize İtem Temizleme
Merhaba değerli forum sakinleri,
Sunucunuzda hatalı dağıtılan bir eşyayı, suistimal (bug/dupe) edilen bir itemi veya piyasadan tamamen kaldırmak istediğiniz bir nesneyi (Astral/Immortal Stone, Silk Scroll, Coin vb.) tüm sunucudan tek bir sorguyla temizlemek isteyebilirsiniz.
Aşağıda paylaşılan optimize sorgu; belirtilen eşyayı **oyuncu çantalarından**, **banka kasalarından**, **guild kasalarından** ve **toplayıcı/binek hayvanı (Pet - COS) çantalarından** siler; ardından
_Items tablosunda kalan yetim kayıtları da temizleyerek veritabanı şişmesini engeller.Önemli Güvenlik Uyarısı' Alıntı:DİKKAT:
- Bu sorgu çalıştırılmadan önce GameServer ve ShardManager modüllerinin kapalı olması veya oyuncuların oyunda olmaması kesinlikle önerilir. Karakterler online iken envanter tabloları güncellenirse, oyuncular oyundan çıkış yaparken belleklerindeki eski çanta verisini tekrar DB'ye yazabilirler.
- İşlem öncesinde mutlaka SRO_VT_SHARD yedeğinizi alınız.
Hatasız & Tam Temizleme Yapan SQL Query Kodu
SQL:
USE [SRO_VT_SHARD]
GO
-- ===================================================================
-- SİLİNECEK EŞYANIN KOD ADI
-- ===================================================================
DECLARE @Codename128 VARCHAR(128) = 'ITEM_ETC_ARCHEMY_MAGICSTONE_ASTRAL_13'
-- Eşyanın ID bilgisini alıyoruz
DECLARE @RefItemID INT = (SELECT ID FROM dbo._RefObjCommon WHERE CodeName128 = @Codename128)
IF (@RefItemID IS NULL)
BEGIN
RAISERROR('HATA: Belirtilen eşya kodu (_RefObjCommon) veritabanında bulunamadı!', 16, 1)
RETURN
END
-- Silinecek eşyaların benzersiz Serial ID64 listesini geçici tabloya al
DECLARE @DeletedItems TABLE (ItemID64 BIGINT)
INSERT INTO @DeletedItems (ItemID64)
SELECT ID64 FROM dbo._Items WHERE RefItemID = @RefItemID
-- ===================================================================
-- 1. ADIM: ENVANTERLERDEKİ SLOTLARI BOŞALT (ItemID = 0)
-- ===================================================================
-- 1.1. Karakter Çantaları (_Inventory)
UPDATE INV
SET INV.ItemID = 0
FROM dbo._Inventory INV
INNER JOIN @DeletedItems D ON D.ItemID64 = INV.ItemID
-- 1.2. Kişisel Kasalar (_Chest)
UPDATE CH
SET CH.ItemID = 0
FROM dbo._Chest CH
INNER JOIN @DeletedItems D ON D.ItemID64 = CH.ItemID
-- 1.3. Guild Kasaları (_GuildChest)
UPDATE GCH
SET GCH.ItemID = 0
FROM dbo._GuildChest GCH
INNER JOIN @DeletedItems D ON D.ItemID64 = GCH.ItemID
-- 1.4. Pet / Binek Envanterleri (_InvCOS)
UPDATE COS
SET COS.ItemID = 0
FROM dbo._InvCOS COS
INNER JOIN @DeletedItems D ON D.ItemID64 = COS.ItemID
-- ===================================================================
-- 2. ADIM: _Items TABLOSUNDAKİ YETİM KAYITLARI SİL (Veri Temizliği)
-- ===================================================================
DELETE IT
FROM dbo._Items IT
INNER JOIN @DeletedItems D ON D.ItemID64 = IT.ID64
PRINT '====================================================='
PRINT 'BAŞARILI: ' + @Codename128 + ' eşyasına ait tüm kayıtlar sunucudan tamamen silindi!'
PRINT 'Silinen toplam eşya sayısı: ' + CAST((SELECT COUNT(*) FROM @DeletedItems) AS VARCHAR(10))
PRINT '====================================================='
Yapılan İyileştirmeler Nelerdir?
- Yetim Kayıt Temizliği (Clean Deletion): Eski yöntemde eşya yuvaları `0` yapılıyor ancak veritabanındaki `_Items` satırları kalıyordu. Bu sorguyla fiziksel veri de güvenle temizlenir.
- Performans İndeksi: Tablolar `CodeName128` üzerinden 4 kere JOIN edilmek yerine önce filtrelenen tekil ID listesi alınır; bu sayede milyonlarca kayıt içeren sunucularda sorgu kilitlenme (deadlock) yaratmadan birkaç saniyede biter.
- Raporlama Çıktısı: Sorgu bittiğinde Messages panelinde sunucudan toplam kaç adet item silindiğini raporlar.
Nasıl Uygulanır?
- Mümkünse sunucu modüllerini geçici olarak kapatın veya oyunu bakım moduna alın.
- SQL Server Management Studio (SSMS) programını açın.
- Üst menüden New Query butonuna tıklayı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.
- İşlem bittiğinde sunucunuzu tekrar başlatabilirsiniz.
Sorularınızı ve takıldığınız yerleri konu altından belirtebilirsiniz. Herkese iyi forumlar!

