dataSource new Instance
04/01/2010 00:00
0
olá galera!

Passado algum tempo depois de resolver isso http://grailsbrasil.com/viewtopic.php?f=1&t=681, vi que não está sendo a melhor solução.

O seguinte problema está ocorrendo:
- Em algumas tabelas tenho um campo que grava default o usuário logado no banco que esta fazendo aquele INSERT;
- Quando eu (erhorn) faço login e insiro um registro em uma dessas tabelas, o campo login da tabela grava meu usuario (erhorn);
- Se outro usuário efetua login no sistema (em outra maquina), não faz mais nada e na sequência eu, que já estou logado antes desse segundo usuário, tento inserir um novo registro o campo login salva o usuário desse segundo que logou e não o meu.

<!-- s:? --><img src="{SMILIES_PATH}/icon_confused.gif" alt=":?" title="Confused" /><!-- s:? -->

O que eu consegui entender procurando na net é que o grails não cria outro DataSource.groovy, apenas sobrescreve as propriedades quando usado essa abordagem:
dataSource.url = 'jdbc&#58;db&#58;//new_server/schema'
dataSource.username = 'new_username'
dataSource.password = 'new_password'


Fiquei preocupado, se não tiver jeito de contornar vai ser um problemão.
Toda auditoria está sendo preparada para isso!
Estou torcendo para que seja apenas algum detalhe que deixei passar <!-- s:roll: --><img src="{SMILIES_PATH}/icon_rolleyes.gif" alt=":roll:" title="Rolling Eyes" /><!-- s:roll: -->

Preciso da ajuda de vocês! O que posso fazer nesse caso?
valeu.

obs: não posso usar o plugin de auditoria, já tem no banco e tem que continuar sendo por lá.

código do meu LoginController:

import java.sql.*
import groovy.sql.Sql

class LoginController {

def dataSource

def index = {
}

def authenticate = {

String usuario = params.login
String senha = params.password
String driver = &quot;com.sybase.jdbc3.jdbc.SybDriver&quot;
String url = &quot;jdbc&#58;sybase&#58;Tds&#58;10.0.128.39&#58;5000/aluno&quot;
String erro = &quot;&quot;

try{
Class.forName(driver)
}catch(Exception e){
erro = &quot;Driver não encontrado&quot;
}
try{
DriverManager.getConnection(url,usuario,senha)
session.conectado = true

}catch(Exception e){
erro = &quot;Usuário ou Senha Inválidos!&quot;
}

if(session.conectado){
dataSource.url = url
dataSource.username = usuario
dataSource.password = senha

Sql sql = Sql.newInstance(dataSource)
def rs_usuario_e = sql.rows(&quot;&quot;&quot;
SELECT nm_usuario
FROM acesso_g..usuario
WHERE cd_usuario = ${usuario}
&quot;&quot;&quot;)

session.usuario_e = rs_usuario_e.nm_usuario[0]

session.user = usuario
flash.message = &quot;Bem vindo(a) ${session.usuario_e}!&quot;
redirect(uri&#58;&quot;&quot;)
}else{
flash.error = &quot;${erro}&quot;
redirect(action&#58;&quot;index&quot;)
}
}

def logout = {
session.invalidate()
flash.message = &quot;Você foi desconectado!&quot;
redirect(controller&#58;&quot;login&quot;, action&#58;&quot;index&quot;)
}

}
Tags: Grails


0
Amigo, já deu uma olhada no plugin Datasources?
<!-- m --><a class="postlink" href="http://grails.org/plugin/datasources">http://grails.org/plugin/datasources</a><!-- m -->

Você trabalha com Grails normalmente (domain.save()) porém com outros datasources.

É muito fácil: irá existir um novo arquivo Datasources.groovy, onde você pode especificar um novo datasource (ou mais) e apontar para as entidades de domínio que utilizarão esta nova conexão.

Espero que tenha ajudado!


0
obrigado pela atenção wanderson.santos!

Eu já li sobre esse plugin sim, mas não vai servir hehe
Não é viável eu criar novos arquivos de dataSource pois teria que criar milhares <!-- s:shock: --><img src="{SMILIES_PATH}/icon_eek.gif" alt=":shock:" title="Shocked" /><!-- s:shock: -->
um para cada usuário (professores e funcionários da universidade)

A base de dados é sempre a mesma então eu não preciso especificar novos dataSources.

Teria que ser algo do tipo &quot;para cada usuário que faz login no sistema, o grails criar (realmente criar) uma nova instancia do dataSource e não apenas sobrescreve-lo&quot;
05/01/2010 00:00


0
Opa ehorn, beleza?

Tenho algumas sugestões para a sua auditoria.

1. Já pensou em usar triggers? Você pode criar triggers no seu banco de dados que interceptem o momento de alteração das tabelas e, com base nisto, persistir os dados de acordo com o que você precisa. Assim não precisa tocar em linha alguma dentro do seu código groovy

2. Você também pode usar os interceptadores do próprio Grails pra que, após o insert/edit de registros nas suas tabelas, salvar o registro de alteração em outra tabela, e não na mesma. Assim você não corre o risco de sobrescrever informações passadas.

E ai? o que me diz?


0
[quote=&quot;kicolobo&quot;]1. Já pensou em usar triggers? Você pode criar triggers no seu banco de dados que interceptem o momento de alteração das tabelas e, com base nisto, persistir os dados de acordo com o que você precisa. Assim não precisa tocar em linha alguma dentro do seu código groovy[/quote]

então kicolobo, esse é o modo que está sendo feito. Mas vai ser alterado pro sistema de auditoria interno do Sybase.

O problema não é esse, até aí ta tudo bem. O que está acontecendo é que não está instanciando o dataSource corretamente.

Vou te dar um exemplo que me aconteceu agora nos testes que estava fazendo. Seguinte:

No meu DataSource.groovy o username está setado para &quot;grails&quot;.
Eu entrei no sistema e efetuei login com meu usuário (erhorn),
após isso executei uma action list qualquer e fiquei restreando no banco para ver qual usuário apareceria.
Deveria ter sido erhorn mas foi o usuário grails que executou o select do list.

Esse é o problema, talvez meu controller Login esteja errado ou faltou alguma coisa
dataSource.url = url
dataSource.username = usuario
dataSource.password = senha


Será muito ruim se não tiver como acertar isso pois tenho varias views que condicionam o resultado com base no usuário que está executando o select ( WHERE usuario=suser_name() )
14/01/2010 00:00


0
hmm... saquei ehorn.

Você quer passar pra lá o usuário logado no sistema, e não o que acessa o banco de dados.

Faça o seguinte: crie um service para o qual você passe a instância persistida e o usuário e processe a auditoria a partir deste service.
Ai você resolveria o problema, não?



Ainda não faz parte da comunidade???

Para se registrar, clique aqui.


Aprenda Groovy e Grails com a Formação itexto!

Newsletter Semana Groovy

Assinar

Envie seu link!


Livro de Grails


/dev/All

Os melhores blogs de TI (e em português) em um único lugar!

 
Creative Commons
RSS Grails Brasil é mantido por itexto Consultoria.
Em caso de problemas contacte Henrique Lobo Weissmann (Kico) por e-mail: kico@itexto.com.br
Todo o conteúdo presente neste site adota o Creative Commons como licença padrão.
Ver: 4.14.0
itexto