Dispara Trigger no acesso JDBC/ODBC

Discussão em 'Banco de Dados / Database' iniciado por gbouvie, Fevereiro 23, 2010.

  1. gbouvie

    gbouvie Membro Participativo

    Marcos!

    Só mais uma pergunta: Qual programa você usou para acessar o BD e criar as triggers?

    Obrigado

    Giovani Bouvié
  2. kirchner

    kirchner Membro Participativo Moderador

    Giovani,

    Qualquer programa que suporte ODBC/JDBC pode ser usado.
    Aqui tem um exemplo:
    http://ingleses.datasul.com.br/blog/pos ... -JDBC.aspx

    É uma ferramenta FREE que usa JDBC.
    Pode usar também o sqlexp, que vem junto com o Progress. O único detalhe é que é via linha de comando:
    sqlexp -H server -S porta -db banco -user sysprogress -pass sys

    Eu normalmente uso o sqlexp mesmo.
  3. gbouvie

    gbouvie Membro Participativo

    Marcos!

    Eu já uso o squirrel para fazer agumas consultas e outros operações sobre alguns BDs. Porém nunca havia criado tabela ou trigger e quando tento criar a trigger aparece a seguinte mensagem: Error: [DataDirect][OpenEdge JDBC Driver][OpenEdge] Objeto do banco de dados (tabela, view, indice, trigger, procedure ou sinonimo) com o owner sysprogress nao pode ser criado, excluido ou alterado. (7883)
    SQLState: HY000
    ErrorCode: -211015

    Pelo que vejo o usuário sysprogress não tem permissão para a criação de triggers, tabelas, views, indices, etc... Mas me certifiquei de que esse usuário com o qual estou logado tem permissões totais em todas as tabelas.

    Obrigado,

    Giovani Bouvié
  4. kirchner

    kirchner Membro Participativo Moderador

    Giovani, não é isso,

    O sysprogress tem permissão para fazer tudo no banco, inclusive apagar todas as tabelas.

    O que ocorre é que o progress não permite que o sysprogress seja owner (dono) de objetos que você cria. Somente objetos de sistema (system tables, system views) podem ter owner sysprogress. O owner é o nome na frente dos objetos, ex:
    Código:
    SELECT * FROM PUB.item;
    O PUB ali em cima é o owner. Tudo que é criado via Data Dictionary possui owner PUB. Os programas ABL só podem acessar objetos do owner PUB.
    Via SQL você consegue criar objetos e acessá-los com outros owners.

    Na hora de criar o objetos, qualquer que seja, você pode colocar um owner:

    Código:
    CREATE TRIGGER Copia.TR_Item
    AFTER INSERT
    Repara no Copia, no código acima.
  5. gbouvie

    gbouvie Membro Participativo

    Marcos!

    Faço a trigger da seguinte forma e aparece a seguinte mensagem:
    Error: [DataDirect][OpenEdge JDBC Driver][OpenEdge] Syntax error in SQL statement at or about " import java.sql.*" (10713)
    SQLState: HY000
    ErrorCode: -210056
    Error occured in:
    CREATE TRIGGER PUB.testatrigger
    AFTER INSERT ON PUB."c-tit-associado"
    REFERENCING NEWROW FOR EACH ROW
    IMPORT
    BEGIN
    import java.sql.*

    Código:
    CREATE TRIGGER PUB.testatrigger
    AFTER INSERT ON PUB."c-tit-associado"
    REFERENCING NEWROW FOR EACH ROW
    IMPORT
       import java.sql.*;
       import java.math.*;
    BEGIN
    
       Integer v1;
       String v3;
       BigDecimal v2;
    
       v1 = (Integer)NEWROW.getValue(1, INTEGER);
       v2 = (String)NEWROW.getValue(2, VARCHAR);
       v3 = (BigDecimal)NEWROW.getValue(4, DECIMAL);
    
       SQLIStatement stmt = new SQLIStatement("UPDATE PUB.\"c-tit-associado\" SET atualizado = 1 WHERE cod-emitente = ? and valor = ? and nr-ticket = ? and atualizado = 0");
       stmt.setParam(1, v1);
       stmt.setParam(2, v2);
       stmt.setParam(3, v3);
       stmt.execute();
    
    END;
    O que pode ser isto?

    Obrigado,

    Giovani Bouvié
  6. kirchner

    kirchner Membro Participativo Moderador

    Giovani,

    Copiei seu código em um banco sports2000, mudei o nome da tabela p/ item e deu um erro de compilação.
    Dá uma olhada aqui:

    Código:
       Integer v1;
       String v3;
       BigDecimal v2;
    
       v1 = (Integer)NEWROW.getValue(1, INTEGER);
       v2 = (String)NEWROW.getValue(2, VARCHAR);
       v3 = (BigDecimal)NEWROW.getValue(4, DECIMAL);
    Você declarou v2 como BigDecimal e v3 como String. Mas está atribuindo ao contrário. Eu corrigi isto e a trigger criou. Estou executando via sqlexp, mas acho que isso não influencia. Tenta corrigir o código primeiro, se der erro ainda tenta executar no sqlexp.

Compartilhe esta Página