Jump to content
Fivewin Brasil

Criação de TRIGGER


Luiz Fernando

Recommended Posts

Sera que alguém teria um exemplo de como criar triggers dentro do sistema.

usando um editor de banco de dados(SQLyog) o código ficou assim,

DELIMITER $$

USE empresoft $$

DROP TRIGGER tr_etiqueta_g $$

CREATE
    TRIGGER tr_etiqueta_g 
    AFTER 
    INSERT 
    ON altepre 
    FOR EACH ROW BEGIN
        INSERT INTO etique_gandola ( produto,preco,conferido )
        VALUES ( new.codigo, new.vlratu, "N" ) ;
    END;
$$

DELIMITER ;

o código acima funciona certinho sem problema, mais não tenho como ficar editando todos banco de dados de meus cliente para fazer isto manual, tentei criar dentro do sistema da forma abaixo, mais não da certo

function tr_etiqueta_g()
cSql='DELIMITER $$'
cSql+=''
cSql+='USE empresoft $$'
cSql+=''
cSql+='DROP TRIGGER tr_etiqueta_g $$'
cSql+=''
cSql+='CREATE'
cSql+='    TRIGGER tr_etiqueta_g' 
cSql+='    AFTER' 
cSql+='    INSERT' 
cSql+='    ON altepre' 
cSql+='    FOR EACH ROW BEGIN'
cSql+='        INSERT INTO etique_gandola ( produto,preco,conferido )'
cSql+='        VALUES ( new.codigo, new.vlratu, "N" ) ;'
cSql+='    END;'
cSql+='$$'
cSql+=''
cSql+=' DELIMITER ;'
SqlExecute(cSql) 
return .t.

Obrigado

Link to comment
Share on other sites

Olá,

Faça uma rotina que verifique a existência. Caso não exista, crie.

aSql := SqlArray( 'SHOW TRIGGERS FROM empresoft ' )
   
for i := 1 to len( aTriggers )
 
      nAchou:=AAscan( aSql, lower(aTriggers[i]) )
       
      if nAchou=0
             if !CriaTrigger( aTriggers[i] )
                  MsgAlert( 'problema', 'Problema' )
             endif
      endif
next
return nil

static function CriaTrigger( cTrigger )

if cTrigger='tr_etiqueta_g'
    cSql:='USE empresoft;'
    cSql+=''
    cSql+='DROP TRIGGER tr_etiqueta_g;'
    cSql+=''
    cSql+='CREATE'
    cSql+=' TRIGGER tr_etiqueta_g'
    cSql+=' AFTER'
    cSql+=' INSERT'
    cSql+=' ON altepre'
    cSql+=' FOR EACH ROW BEGIN'
    cSql+=' INSERT INTO etique_gandola ( produto,preco,conferido )'
    cSql+=' VALUES ( new.codigo, new.vlratu, "N" ) ;'
    cSql+=' END;'
    cSql+=''
    SqlExecute(cSql) 
endif

return .t.
Link to comment
Share on other sites

Evandro não cria a triggers de forma alguma, de primeiro momento só estou fazendo a chamada para criar a triggers

no inicio do programa faço a chamada tr_etiqueta_g() sem fazer nenhuma comparação, se eu copiar da forma que esta abaixo e colar num editor de sql, dai funciona certinho.

function tr_etiqueta_g()
  cSql:='USE empresoft;'
  cSql+=''
  cSql+='DROP TRIGGER tr_etiqueta_g;'
  cSql+=''
  cSql+='CREATE'
  cSql+=' TRIGGER tr_etiqueta_g'
  cSql+=' AFTER'
  cSql+=' INSERT'
  cSql+=' ON altepre'
  cSql+=' FOR EACH ROW BEGIN'
  cSql+=' INSERT INTO etique_gandola ( produto,preco,conferido )'
  cSql+=' VALUES ( new.codigo, new.vlratu, "N" ) ;'
  cSql+=' END;'
  cSql+=''
  SqlExecute(cSql) 
return .t.

Obs: sobre a logica acima , eu entendi certinho, de criar um array com todos triggers usado no sistema e depois com show TRIGGERS, comparar as duas array, vou utilizar sua ideia aqui

Obrigado

Luiz Fernando

Link to comment
Share on other sites

Olá,

Tente assim:

function tr_etiqueta_g()
  cSql:='USE empresoft;'
  SqlExecute(cSql) 

  cSql:='DROP TRIGGER tr_etiqueta_g;'
  SqlExecute(cSql) 

  cSql:='CREATE'
  cSql+=' TRIGGER tr_etiqueta_g'
  cSql+=' AFTER'
  cSql+=' INSERT'
  cSql+=' ON altepre'
  cSql+=' FOR EACH ROW BEGIN'
  cSql+=' INSERT INTO etique_gandola ( produto,preco,conferido )'
  cSql+=' VALUES ( new.codigo, new.vlratu, "N" ) ;'
  cSql+=' END;'
  cSql+=''
  SqlExecute(cSql) 
return .t.

Link to comment
Share on other sites

Evandro realmente não cria, agora só uma observação, da sua forma acima mesmo colando no editor não da certo, se eu salvar uma script dentro do editor fica exatamente igual abaixo se eu tirar estes $$ da erro, peguei a script gerado no arquivo e copiei igualzinha para dentro do prg e nada.

DELIMITER $$

USE empresoft $$

DROP TRIGGER teste1 $$

CREATE  TRIGGER teste1 
    AFTER 
    INSERT 
    ON produto 
    FOR EACH ROW BEGIN
    END;
$$

DELIMITER ;

aqui uso a versão do mysql 5.1.42

Obrigado

Link to comment
Share on other sites

Vlw Kapiaba, qdo a sintaxe de como usar já conseguir pegar o jeito mais ou menos, o problema mesmo é mandar instrução de dentro do programa para criação da mesma, sem ter que usa rum editor de banco de dados para isto, mais como deu certo com o Evandro vou mexer com calma aqui, depois retorno ao tópico.

Obrigado

Link to comment
Share on other sites

Colegas agora consegui, o problema estava na seguinte situação, minha versão do mysql não aceita duas triggers disparada para a mesma tabela do banco de dados, tipo nos teste aqui eu só mudava o nome da triggers mais o ON <tabela> deixava o mesmo, como já existia uma triggers la criada manual dava o erro, agora ta rodando certinho.

Abraços

Luiz Fernando

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...