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 ?
<?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_HOST, MSSQL_USER, MSSQL_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']);
}
}
?>
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 duQuote:
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.Quote:
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 ?
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.Quote:
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ß.
fehlen nicht teilweise die indexes? hab das ma was mit bekommen das die damals nicht mit genommen wurden.Quote:
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.
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
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
exec CHARACTER_DELETE_STR 'xx' GO
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).Quote:
set @ddate = convert(char(8),DATEADD(d, -7, getdate()),112)