Verifica e poste aqui o tipo de collation das seguintes colunas e tabelas:
COLUNA / TABELA
memb___id / MEMB_INFO
memb___id / MEMB_STAT
AccountID / Character
Name / Character
Id / AccountCharacter
[]'s
Verifica e poste aqui o tipo de collation das seguintes colunas e tabelas:
COLUNA / TABELA
memb___id / MEMB_INFO
memb___id / MEMB_STAT
AccountID / Character
Name / Character
Id / AccountCharacter
[]'s
Última edição por Renato; 08-11-2015 às 09:22 AM.
Código PHP:
<?php
if(Weather::getState() == 'Rainy weather') {
$this->removingLittleHorseFromRain();
}
Consegui retirar o erro de collation , mais quando coloquei trocar de char , sumiu todos chars da conta, poderia me ajudar ?
só dando um feedback para quem vai tentar usar, realmente em inumeros testes os chars "somem" eles não são deletados nem nada, mais buga de não aparece os chars na lista de chars ingame.
Ainda estou vendo se consigo "arrumar", em todo caso tomem cuidado.
@viOleNt verifique se fez a instalação da forma correta. Eu testei várias vezes localmente e no servidor de um colega. Em nenhum dos testes ocorreu o erro citado por você. É novidade pra mim kk
O que pode ter ocasionado o erro é collation das tables e colunas. Cheque elas.
Em todo caso: backup sempre.
Última edição por Renato; 11-02-2016 às 09:06 AM.
Código PHP:
<?php
if(Weather::getState() == 'Rainy weather') {
$this->removingLittleHorseFromRain();
}
sim , eu fisso backup quando testei , aconteceu de os chars sumir mesmo, quando loguei estava normal , mais quando coloquei pra trocar de char , sumiu todos ^^
Quem tiver com problemas dos chars sumirem, segundo meus testes, é o NOCOUNT do sql que está dando problema, para arrumar é simples, roda a trigger com o código abaixo que vai arrumar.
As alterações necessárias estão destacadas em vermelho, qualquer duvida, só responder aqui que ajudo.Código:/* | @author - Renato Valer | @version - 2.1.1 | @last update - 2015/08/29 - 12h23min | @warning: Não me responsabilizo por uso incorreto e possíveis deadlocks. Use por sua conta e risco. */ USE MuOnline GO IF EXISTS (SELECT name FROM sysobjects WHERE name = 'AccountCharacter_Online' AND type = 'TR') DROP TRIGGER [AccountCharacter_Online] GO CREATE TRIGGER [AccountCharacter_Online] ON [dbo].[AccountCharacter] AFTER UPDATE AS SET NOCOUNT ON /* | Hipóteses | | | 1 - Se GameIDC foi atualizado, algum char foi foi logado. Surgem hipóteses: | | 1.1 - GameIDC e Old_GameIDC são diferentes: | | 1.1.1 - Old_GameIDC é NULL, logo é o primeiro char logado (e possivelmente o primeiro criado) na conta, | pois não existe GameIDC anterior. | 1.1.2 - Já existe um GameIDC anterior, logo significa que o cara acessou outro char. Surgem 2 hipóteses: | | 1.1.2.1 - O cara simplesmente trocou de char sem deslogar a conta: | 1.1.2.1.1 - O cara logou um char, deletou ele e entrou em outro. | 1.1.2.2 - O cara relogou a conta e entrou em outro char. | 1.1.2.2.1 - O cara logou um char, deletou ele, saiu da conta, voltou e entrou em outro. | | 1.2 GameIDC e Old_GameIDC são iguais: | | 1.2.1 - O cara relogou o char. | 1.2.2 - O cara relogou a conta e entrou no mesmo char. | | 2. Se GameIDC não foi atualizado, não precisa fazer nada, porque significa: | | 2.1 - Que um char foi criado, mas não foi logado. | 2.2 - Que um char foi deletado sem nem mesmo ter sido logado. | | */ -- Hipótese 1 IF UPDATE(GameIDC) BEGIN DECLARE @Login VARCHAR(10), @GameIDC VARCHAR(10), @Old_GameIDC VARCHAR(10), @GameIDC_ConnectTM DATETIME, @GameIDC_ConnectTM_Int INT, @Old_GameIDC_ConnectTM DATETIME, @Old_GameIDC_ConnectTM_Int INT, @GameIDC_DisConnectTM DATETIME, @GameIDC_DisConnectTM_Int INT, @Old_GameIDC_DisConnectTM DATETIME, @Old_GameIDC_DisConnectTM_Int INT, @Account_DisconnectTM DATETIME, @Account_DisconnectTM_Int INT, @Now DATETIME, @Now_Int INT, @TimeON BIGINT; SET @Login = (SELECT Id FROM INSERTED); SET @GameIDC = (SELECT GameIDC FROM AccountCharacter WHERE Id = @Login); SET @Old_GameIDC = (SELECT GameIDC FROM DELETED); SET @Now = GETDATE(); SET @Now_Int = DATEDIFF(s, '19700101', @Now); SET @Account_DisconnectTM = (SELECT DisconnectTM FROM MEMB_STAT WHERE memb___id = @Login); SET @Account_DisconnectTM_Int = DATEDIFF(s, '19700101', @Account_DisconnectTM); -- Hipótese 1.1 IF(@GameIDC <> @Old_GameIDC) BEGIN -- Hipótese 1.1.1 IF(@Old_GameIDC IS NULL) BEGIN UPDATE Character SET ConnectTM = @Now WHERE AccountID = @Login AND Name = @GameIDC; END -- Hipótese 1.1.2 ELSE BEGIN SET @Old_GameIDC_DisconnectTM = @Now SET @Old_GameIDC_DisconnectTM_Int = @Now_Int; -- Hipótese 1.1.2.1 IF(@Account_DisconnectTM_Int <> @Old_GameIDC_DisconnectTM_Int) BEGIN -- Verificação da Hipótese 1.1.2.1.1 IF EXISTS(SELECT Name FROM Character WHERE AccountID = @Login AND Name = @Old_GameIDC) BEGIN SET @Old_GameIDC_ConnectTM = (SELECT ConnectTM FROM Character WHERE AccountID = @Login AND Name = @Old_GameIDC); SET @Old_GameIDC_ConnectTM_Int = DATEDIFF(s, '19700101', @Old_GameIDC_ConnectTM); SET @TimeON = @Old_GameIDC_DisconnectTM_Int - @Old_GameIDC_ConnectTM_Int; UPDATE Character SET TimeON = TimeON + @TimeON, DisConnectTM = @Now WHERE AccountID = @Login AND Name = @Old_GameIDC; END END -- Hipótese 1.1.2.2 e "fim" da Hipótese 1.1.2.1 -- A query é a mesma e um "else" é desnecessário. /* | Não é necessário atualizar tempo on, porque se o cara relogou a conta | a WZ_DISCONNECT_MEMB já fez o serviço. Só precisamos atualizar o momento | de connect do novo char. */ UPDATE Character SET ConnectTM = @Now WHERE AccountID = @Login AND Name = @GameIDC; END END --Hipótese 1.2. ELSE BEGIN -- Apenas precaução... IF(@GameIDC IS NOT NULL) BEGIN /* | Desnecessário checar se o char existe, porque se essa parte | do script está sendo executada, é porque o char foi logado | agora, logo é presumível que existe. */ SET @GameIDC_ConnectTM = (SELECT ConnectTM FROM Character WHERE AccountID = @Login AND Name = @GameIDC); SET @GameIDC_ConnectTM_Int = DATEDIFF(s, '19700101', @GameIDC_ConnectTM); SET @GameIDC_DisconnectTM_Int = @Now_Int; -- Hipótese 1.2.1 IF(@Account_DisconnectTM_Int < @GameIDC_ConnectTM_Int) BEGIN SET @TimeON = @GameIDC_DisconnectTM_Int - @GameIDC_ConnectTM_Int; UPDATE Character SET TimeON = TimeON + @TimeON, DisConnectTM = @Now, ConnectTM = @Now WHERE AccountID = @Login AND Name = @GameIDC; END -- Hipótese 1.2.2 ELSE BEGIN /* Não é necessário atualizar tempo on, porque se o cara relogou a conta a WZ_DISCONNECT_MEMB já fez o serviço. */ UPDATE Character SET ConnectTM = @Now WHERE AccountID = @Login AND Name = @GameIDC; END END END SET NOCOUNT OFF END
P.S: essa alteração faz o SQL suprimir aquelas mensagens de quantas linhas foram atualizadas ( XXX rows updated ), ou seja, não tem nenhum efeito adverso.
[]'s
Forum Owner & Admin - Imperyus Games Brasil
Só complementando a solução do Willerson:
As triggers do SQL costumam exercer a função de executar outras queries após o efeito do insert/update/delete na tabela/coluna em questão.
Consequentemente, se você está executando outras queries na trigger, que é o caso, automaticamente você muda o ESTADO do resultado do SQL no client.
Com isso, o DataServer não consegue fazer a verificação correta se o UPDATE teve êxito, pois o retorno da query será mais de um resultado e não o esperado pelo mesmo.
A syntax "NOCOUNT", como já dito pelo Willerson, tem o objetivo de ocultar qualquer resultado de "contagem" aos registros afetados pela query.
Sendo assim, todos os UPDATES feitos dentro da trigger não serão contabilizados e não terão retorno, ou seja, serão executados em "silêncio" como deveria ser.
Alguns servidores podem não ter tido o problema, pois a versão do DataServer em questão deve travar os estados de SQL de outra forma.
PS: Renato é gay. ;*
[]'s
Há 1 usuários navegando neste tópico. (0 registrados e 1 visitantes)
Marcadores