Flyff Chars komplett aus DB löschen?!

08/19/2013 10:55 TrøublêMakêr#1
Da langsam viele Chars in meinen DB befinden, würde ich gerne alle Löschen, die schon auf "d" sind sowie die Perm Banned sind! Gibt es von offi so ne Funktion ?
08/19/2013 10:57 raventh1984#2
Why not execute an mssql query?
DELETE FROM CHARACTER_TBL WHERE isblock = 'D'

Then you will delete all the chars that have the value D in isblok
08/19/2013 11:16 TrøublêMakêr#3
This is Only Character_TBL. I want do delete all!
08/19/2013 11:38 Mognakor#4
Wenn du die Lösung von raventh nimmst kannst du für die restlichen Tabellen die Query nehmen

DELETE FROM [Tabelle_XY]
WHERE NOT EXISTS (SELECT [hier den key hin, kenn den nich auswendig]
FROM CHARACTER_TBL
WHERE [Tabelle_XY].[key] = CHARACTER_TBL.[key])

Alternativ kannst du auch zuerst auf die anderen Tabellen diese Query ausführen

DELETE FROM [Tabelle_XY]
WHERE EXISTS (SELECT
FROM CHARACTER_TBL
WHERE [Tabelle_XY].[key] = CHARACTER_TBL.[key] AND CHARACTER_TBL.isblock = 'D'

Und dann die Query von raventh

Musst alles was in [] steht durch die tatsächlichen Namen ersetzen vom Prinzip sollte es aber das liefern was du willst.
08/19/2013 11:41 raventh1984#5
Here is what i have made just jet

PHP Code:
<?php
ini_set
('display_errors'1); // 0 = uit, 1 = aan
error_reporting(E_ALL);

//Making connection to mssql database
define('MSSQL_HOST''****\SQLEXPRESS');    // MsSQL Host
define('MSSQL_USER''****');                        // MsSQL Username
define('MSSQL_PASS''****');            // MsSQL Password

$connect mssql_connect(MSSQL_HOSTMSSQL_USERMSSQL_PASS);
if(!
$connect)
{
    
sqlError('There went something wrong with the connection to the database!<br />We send an automatic email to the owner!');
    
notify('Probleem met de query:'.mssql_get_last_message().' in db_connect.php op lijn 34 op datum '.date("Y-m-d").'');
}

function 
database($data)
{
    
$select_db mssql_select_db($data);
    if(!
$select_db)
    {
        
sqlError('There went something wrong with the connection to the database!<br />We send an automatic email to the owner!');
        
notify('Probleem met de query:'.mssql_get_last_message().' in config.inc.php op lijn 13 op datum '.date("Y-m-d").'');    
    }
    return 
$data;
}

function 
delete($table,$value)
{
    
$delete "DELETE FROM ".$table." WHERE m_idPlayer = '".$value."'";
    if(!
$result mssql_query($delete))
    {
        echo 
'Something Whent Wrong';
    }
    else
    {
        echo 
$table.' Has been cleared of characters that where blocked!<br />';
    }
}

//Selecting Character_dbf
database("CHARACTER_01_DBF");
//Selecting chars that have isblock at D
$sql "SELECT m_idPlayer,m_szName,isblock FROM CHARACTER_TBL WHERE isblock = 'D'";
if(!
$res mssql_query($sql))
{
    echo 
'Something whent wrong';
}
else
{
    while(
$result mssql_fetch_assoc($res))
    {
        
//Deleting Stuff From the Tables//
        
delete("BANK_EXT_TBL",$result['m_idPlayer']);
        
delete("BANK_TBL",$result['m_idPlayer']);
    }
}
?>
The only downside is you must add all the tables to it.
08/19/2013 13:18 TrøublêMakêr#6
I test it later on my test server and thanks
08/19/2013 13:23 Мarvіn#7
Quote:
Originally Posted by Bloodyrain' View Post
Da langsam viele Chars in meinen DB befinden, würde ich gerne alle Löschen, die schon auf "d" sind sowie die Perm Banned sind! Gibt es von offi so ne Funktion ?
An deiner Stelle würde ich lieber alle gebannten/gelöschten Charaktere mit 'D' einfach in der Tabelle umbenennen (bsp. "Gelöscht am 19.08.) So machst du
keinen Mist mit der Datenbank und die Spieler können die Namen wieder verwenden (was sicherlich der Sinn dieser Frage hier ist)
08/19/2013 13:49 Velmore#8
Quote:
Originally Posted by Bloodyrain' View Post
Da langsam viele Chars in meinen DB befinden, würde ich gerne alle Löschen, die schon auf "d" sind sowie die Perm Banned sind! Gibt es von offi so ne Funktion ?
Auf Offi wird eine Prozedure dafür verwendet die glaube ich jeden Tag um 04:00 ausgeführt wird.

Die löscht chars die 30 Tage oder länger gelöscht sind.

Das ganze läuft da über den SQL Server Agent so weit ich weiß.
08/19/2013 15:18 TrøublêMakêr#9
Quote:
Originally Posted by Velmore View Post
Auf Offi wird eine Prozedure dafür verwendet die glaube ich jeden Tag um 04:00 ausgeführt wird.

Die löscht chars die 30 Tage oder länger gelöscht sind.

Das ganze läuft da über den SQL Server Agent so weit ich weiß.
Nur Funktioneirt der überhaupt nicht bzw davon habe ich nichts gesehen, da ich noch Chars von 2012 finde und nein Marvin. Ich würde gerne Komplett löschen von DB. Ich finde es effektiver und die DB gewinnt an Leistung. Wobei es kaum bemerkbar ist.
08/19/2013 15:52 Sedrika#10
Seit wann macht es für eine DB etwas aus, ob da viel steht oder wenig ? Höchstens das anzeigen im SQL Studio dauert etwas länger, die DB hat seine indexe, an geschwindigkeit wirst du wohl kaum etwas gewinnen, höchstens an größe.
08/19/2013 16:05 Velmore#11
Quote:
Originally Posted by Sedrika View Post
Seit wann macht es für eine DB etwas aus, ob da viel steht oder wenig ? Höchstens das anzeigen im SQL Studio dauert etwas länger, die DB hat seine indexe, an geschwindigkeit wirst du wohl kaum etwas gewinnen, höchstens an größe.
fehlen nicht teilweise die indexes? hab das ma was mit bekommen das die damals nicht mit genommen wurden.
08/19/2013 16:18 Sedrika#12
Das ist kein Problem. Falls der Index sich nicht ändert, wird bei einem neuen wert der nächst freie genommen.
08/19/2013 16:23 WurstbrotQT#13
Code:
					DELETE CHARACTER_TBL WHERE isblock='D'
					
					DECLARE @name varchar(256)
					DECLARE Delete_Cursor CURSOR FOR 
					SELECT	B.name
						FROM	syscolumns A,sysobjects B
						WHERE	A.id = B.id
					   AND B.name NOT IN('CHARACTER_TBL','MESSENGER_TBL')
					   AND A.name = 'm_idPlayer'
					   AND B.type='U'
					ORDER BY B.name
					
					OPEN Delete_Cursor
					
					FETCH NEXT FROM Delete_Cursor 
					INTO @name
					
					WHILE @@FETCH_STATUS = 0
					BEGIN
						PRINT @name + '??'
						EXEC('DELETE ' + @name + ' WHERE m_idPlayer NOT IN (SELECT m_idPlayer FROM CHARACTER_TBL)')
					   FETCH NEXT FROM Delete_Cursor 
					   INTO @name
					END
					
					DELETE TAG_TBL  WHERE f_idPlayer NOT IN (SELECT m_idPlayer FROM CHARACTER_TBL)
					
					PRINT '??? ?? ??'
					-- ?? 2009-09-16 ??? ?? ?? ?? (EXEC MESSENGER_STR 'D2','',@serverindex ?? ?? ??)
					delete tblMessenger
					where idPlayer not in (select m_idPlayer from CHARACTER_TBL)

					delete tblMessenger
					where idFriend not in (select m_idPlayer from CHARACTER_TBL)

--					EXEC MESSENGER_STR 'D2','',@serverindex

					
					PRINT 'Delete Skill'
					DELETE 	tblSkillPoint 
					WHERE 	PlayerID NOT IN (SELECT m_idPlayer FROM CHARACTER_TBL)


					CLOSE Delete_Cursor
					DEALLOCATE Delete_Cursor
08/19/2013 17:26 xTwiLightx#14
Code:
CREATE proc [dbo].[CHARACTER_DELETE_STR]
	@serverindex char(2)
AS

set nocount on
set lock_timeout 600000
set transaction isolation level read uncommitted
set xact_abort on

	declare @ddate char(8)
	set @ddate = convert(char(8),DATEADD(d, -7, getdate()),112)

	CREATE TABLE #TEMP_DELETE_CHR ( m_idPlayer char(7)  )

	-- 삭제 캐릭터에 대한 캐릭터 ID 입력
	insert into #TEMP_DELETE_CHR 
	select m_idPlayer from CHARACTER_TBL (nolock)
	where isblock='D' AND  End_Time <= @ddate and serverindex = @serverindex

	-- 삭제 캐릭터에 대한 삭제 정보 입력
	insert into CHARACTER_TBL_DEL (serverindex, m_idPlayer, m_szName, account, m_nLevel, m_nJob, CreateTime)
	select serverindex, m_idPlayer, m_szName, account, m_nLevel, m_nJob, CreateTime
	from CHARACTER_TBL (nolock)
	where m_idPlayer in ( select m_idPlayer from #TEMP_DELETE_CHR)

	DECLARE @name varchar(256)
	DECLARE Delete_Cursor CURSOR FOR 
	
	SELECT	B.name 
		FROM	syscolumns A,sysobjects B
		WHERE	A.id = B.id
			AND B.name NOT IN('MESSENGER_TBL', 'BILING_ITEM_TBL'
				, 'CHARACTER_TBL_DEL', 'tblFunnyCoin',' tblLogout_Penya', 'tblLogout_Penya_Diff_Log'
				, 'GUILD_COMBAT_1TO1_BATTLE_PERSON_TBL'
				, 'BANK_EXT_TBL','BANK_TBL','INVENTORY_EXT_TBL','INVENTORY_TBL')
			and B.name not like '%item2row%'
			and upper(B.name) not like '%TMP_%'
			AND (A.name = 'm_idPlayer' or A.name = 'serverindex')
			AND B.type='U'
		group by B.name
		having count(*) > 1
	ORDER BY B.name
		
	OPEN Delete_Cursor
	
	FETCH NEXT FROM Delete_Cursor 
	INTO @name
					
	WHILE @@FETCH_STATUS = 0
	BEGIN
		PRINT @name + ' TABLE DELETE'
		exec ('DELETE ' + @name + ' WHERE m_idPlayer IN (
					select m_idPlayer from #TEMP_DELETE_CHR ) 
					and serverindex = ''' + @serverindex + '''')
	        FETCH NEXT FROM Delete_Cursor 
		      INTO @name
	END

				
	PRINT 'NOTE DELETE'
	DELETE TAG_TBL  
	WHERE f_idPlayer in (select m_idPlayer from #TEMP_DELETE_CHR) and serverindex = @serverindex
					
	PRINT 'FRIEND LIST DELETE(OTHER USER)'
	delete tblMessenger
	where idPlayer in (select m_idPlayer from #TEMP_DELETE_CHR) and serverindex = @serverindex
	
	delete tblMessenger
	where idFriend in (select m_idPlayer from #TEMP_DELETE_CHR) and serverindex = @serverindex

	PRINT 'Delete Skill'
	DELETE tblSkillPoint 
	WHERE PlayerID in (select m_idPlayer from #TEMP_DELETE_CHR) AND serverindex = @serverindex

	CLOSE Delete_Cursor
	DEALLOCATE Delete_Cursor

	drop table #TEMP_DELETE_CHR
RETURN
Code:
exec CHARACTER_DELETE_STR 'xx'
GO
(xx = bei den meisten hier 01)
???

Schaut mal in eure Datenbanken und lest die Namen der Prozeduren, ihr "Experten".


EDIT:
Quote:
set @ddate = convert(char(8),DATEADD(d, -7, getdate()),112)
Das rot markierte gibt an, wie alt die Chars sein müssen, damit sie gelöscht werden. Das hier ist älter als 7 Tage (00:00 Uhr).
08/20/2013 12:04 TrøublêMakêr#15
Danke Twi.

Ging perfekt bis auf den kleinen Rollback!