Estou escrevendo um gatilho para auditar o banco de dados MySQL. A instrução IF não funciona. Onde estou errando?
Além disso, você pode me orientar sobre o melhor gatilho para auditoria do mysql.
DELIMITER $$
CREATE
DEFINER = 'sqlsa'@'%'
TRIGGER AuthenticationLog_U
AFTER UPDATE
ON AuthenticationLog
FOR EACH ROW
BEGIN
DECLARE Type varchar(1);
DECLARE TableId tinyint;
DECLARE IsActive tinyint;
SET @Type='U';
SET @TableId = 2;
SET @IsActive = (SELECT IsActive FROM AuditDB.ExportLogTableDefinition WHERE TableId=@TableId);
IF (@IsActive=1) THEN
INSERT INTO AuditDB.ExportLog (DBName,TableId,OperationType,HostName,UserName,PrimaryKey,OldData,NewData)
VALUES (DATABASE(),@TableId,@Type,@@hostname,CURRENT_USER(),OLD.PKAuthenticationLogID,
CONCAT_WS('',
'[Key]=',IFNULL(OLD.Key,'NULL')
,'[Secret]=',IFNULL(OLD.Secret,'NULL')
,'[Token]=',IFNULL(OLD.Token,'NULL')
,'[ApplicationId]=',IFNULL(OLD.ApplicationId,'NULL')
,'[IpAddress]=',IFNULL(OLD.IpAddress,'NULL')
,'[Message]=',IFNULL(OLD.Message,'NULL')
,'[CreatedOn]=',IFNULL(OLD.CreatedOn,'NULL')
,'[IsSuccess]=',IFNULL(EXPORT_SET(OLD.IsSuccess,'1','0','',1),'NULL')
,'[LogType]=',IFNULL(OLD.LogType,'NULL')
),
CONCAT_WS('',
'[Key]=',IFNULL(NEW.Key,'NULL')
,'[Secret]=',IFNULL(NEW.Secret,'NULL')
,'[Token]=',IFNULL(NEW.Token,'NULL')
,'[ApplicationId]=',IFNULL(NEW.ApplicationId,'NULL')
,'[IpAddress]=',IFNULL(NEW.IpAddress,'NULL')
,'[Message]=',IFNULL(NEW.Message,'NULL')
,'[CreatedOn]=',IFNULL(NEW.CreatedOn,'NULL')
,'[IsSuccess]=',IFNULL(EXPORT_SET(NEW.IsSuccess,'1','0','',1),'NULL')
,'[LogType]=',IFNULL(NEW.LogType,'NULL'))
);
END IF;
END
$$
DELIMITER ;
Não há nenhuma mensagem de erro. Mas eu tento consulta, bom trabalho.
SET @IsActive = 1;
IF (@IsActive=1) THEN
Depois de algumas experiências, descobri que o código funciona se eu não prefixar meus nomes de variáveis com um '@':