Ir para conteúdo
Fórum Script Brasil
  • 0

Trigger De Inserção


babaloricha

Pergunta

3 respostass a esta questão

Posts Recomendados

  • 0
como é que eu faco para verificar um registro que esta sendo colocado no banco, tem um campo que é = a um campo de eum registro que já esta no banco?

faz tempo que não mexo com SQLSever, mas você não conseguiria implementar dentro da trigger algo como:

...
IF (SELECT COUNT(*) FROM inserted) > 0
BEGIN
 -- testar ser algum dos itens inseridos já está na base de dados
  IF (SELECT COUNT(*)
      FROM inserted
      WHERE exists(SELECT 1 FROM <tabela> WHERE <tabela>.<campo> =inserted.<campo>)) > 0
  BEGIN
    RAISERROR('Um item já existe. Inclusão cancelada.',16,1);  -- gera uma exceção personalizada
    ROLLBACK;  -- desfaz qualquer ação na transação corrente
    RETURN;  -- evita que linhas posteriores sejam executadas
  END
END

lembro-me que a trigger não é disparada para cada item incluído, assim se faz necessário tratar inserted como uma possível lista de linhas.

Se este exemplo puder ser implementado, ele estará cancelando a inclusão de todas as linhas, mesmo que apenas uma já exista. Mas, se isto não for desejado, então teria que ser implementado algum tipo de loop (se não estou enganado utilizando cursor) para avaliar cada item da lista em inserted

Espero ter colaborado.

Link para o comentário
Compartilhar em outros sites

  • 0
como é que eu faco para verificar um registro que esta sendo colocado no banco, tem um campo que é = a um campo de eum registro que já esta no banco?

faz tempo que não mexo com SQLSever, mas você não conseguiria implementar dentro da trigger algo como:

...
IF (SELECT COUNT(*) FROM inserted) > 0
BEGIN
 -- testar ser algum dos itens inseridos já está na base de dados
  IF (SELECT COUNT(*)
      FROM inserted
      WHERE exists(SELECT 1 FROM <tabela> WHERE <tabela>.<campo> =inserted.<campo>)) > 0
  BEGIN
    RAISERROR('Um item já existe. Inclusão cancelada.',16,1);  -- gera uma exceção personalizada
    ROLLBACK;  -- desfaz qualquer ação na transação corrente
    RETURN;  -- evita que linhas posteriores sejam executadas
  END
END

lembro-me que a trigger não é disparada para cada item incluído, assim se faz necessário tratar inserted como uma possível lista de linhas.

Se este exemplo puder ser implementado, ele estará cancelando a inclusão de todas as linhas, mesmo que apenas uma já exista. Mas, se isto não for desejado, então teria que ser implementado algum tipo de loop (se não estou enganado utilizando cursor) para avaliar cada item da lista em inserted

Espero ter colaborado.

Micheus...a trigger é sim disparada para cada item inserido...

toda vez que você executar um insert, a trigger inserted irá disparar com ctz...

não entendi perfeitamente sua referência por 'lembro-me que a trigger não é disparada para cada item incluído, assim se faz necessária tratar inserted como uma possível lista de linhas'.

Logo depois que a trigger terminar seu processo de execução, todos os itens (somente 1) que estiver em inserted será excluído...é como tratar inserted como uma variável table temporária, que se auto-elimina no fim do procedimento...

estou certo? corrija-me se não, por favor...

caso vá trabalhar com cursores, aconselho que não o faça...

cursores são problemáticos, e apesar de, na minha opnião, serem mais 'delicados' para trabalhar, geralmente não conseguem dissernir uma sessão de outra, inutilizando a definição de cursor local e cursor global.

Caso necessite realmente trabalhar com uma variável mutidimensional, trabalhe com uma VARIAVEL TABLE, resgatando seus valores linha por linha através de um campo identity...

bom, é minha opnião...

analise cada caso e retorne os resultados...

Abraços a todos!

Link para o comentário
Compartilhar em outros sites

  • 0
Micheus...a trigger é sim disparada para cada item inserido...

toda vez que você executar um insert, a trigger inserted irá disparar com ctz...

não entendi perfeitamente sua referência por 'lembro-me que a trigger não é disparada para cada item incluído, assim se faz necessária tratar inserted como uma possível lista de linhas'.

este comentário foi porque, se eu não me engano (faz um tempão que não mexo com SQLServer) quando era executado um comando como DELETE FROM (com vários registros), a trigger era chamada apenas uma vez para todos os excluídos e não uma vez para cada uma das linhas eliminadas.

Mas pelo seu comentário, falei besteira.

Obrigado pela correção. ;)

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...