AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 6504
Accepted
Ezi
Ezi
Asked: 2011-10-05 09:14:39 +0800 CST2011-10-05 09:14:39 +0800 CST 2011-10-05 09:14:39 +0800 CST

O gatilho não deve bloquear a inserção

  • 772

Eu tenho um gatilho na inserção, mas se o gatilho falhar, a inserção também falhará.

existe uma maneira de permitir que a inserção continue mesmo se o gatilho falhar?

EDIT: Eu uso um gatilho para enviar um e-mail quando um novo registro é inserido. Quero que o registro seja salvo independentemente se o e-mail foi enviado ou não.

Como eu faria isso de um sp?

sql-server trigger
  • 3 3 respostas
  • 7891 Views

3 respostas

  • Voted
  1. Best Answer
    gbn
    2011-10-05T09:30:14+08:002011-10-05T09:30:14+08:00

    Não

    • Um gatilho faz parte da transação
    • Um erro abortará a instrução INSERT (se não estiver em uma transação explícita)
    • Um erro em um gatilho condenará uma transação (ou seja, deve ser revertida)
    • Um erro em um gatilho onde os blocos TRY/CATCH não são usados ​​(em torno do INSERT também) abortará o lote

    Não use um gatilho. Em vez disso, use um procedimento armazenado para desacoplar a lógica do INSERT.

    Pessoalmente, uma falha de gatilho significa que algum DRI complexo falhou ou não consigo gravar em uma tabela de histórico. Isso é uma coisa ruim...

    Editar:

    • Use o Service Broker para enviar uma notificação do gatilho.
    • Outro pedaço de código irá pegá-lo e enviá-lo de forma assíncrona

    Eu não me implementei, então terei que encaminhá-lo para o Google

    • 10
  2. datagod
    2011-10-06T05:37:38+08:002011-10-06T05:37:38+08:00

    Se você não estiver confortável com o Service Broker, ainda poderá usar o gatilho, mas, em vez de enviar o e-mail, ele insere o conteúdo do e-mail em algum tipo de tabela EmailQueue. Você então teria um processo assíncrono verificando periodicamente essa tabela e processando os e-mails separadamente, excluindo-os da fila quando enviados.

    Desacoplar a geração do e-mail com o envio do e-mail impedirá que as inserções falhem e permitirá que você solucione problemas de e-mail enquanto ainda captura novos e-mails a serem enviados.

    • 5
  3. jerry Hodgson
    2014-05-31T20:06:22+08:002014-05-31T20:06:22+08:00

    SIM

    O gatilho falha em suas instruções normais, valores nulos, etc.

    ::Use um início de gatilho em vez de inserir com

    selecione em #inserted de Inserted

    declare @query nvarchar(max),@iretval int

    ::Você pode ignorar a falha construindo cada instrução em uma consulta

    set @query=N'update.... etc '

    :: também é uma boa ideia verificar a consulta antes do sp_executesql, porque :: se a consulta for nula, o iretval será 0 de qualquer maneira, ou seja

    se @Query for null start set @iretval=999 ir para o último fim

    ::então

    exec @Iretval=sp_executesql @query [[parmameters] outvalue] if @iretval>0 goto Last

    :: sua inserção deve conter um sinalizador ou algo assim para mostrar se o gatilho funcionou, permitindo o processamento subsequente que o gatilho não fez, assumindo que isso é necessário

    Último

    if @iretval=0 update #inserted set flag=ok

    inserir na tabela selecione * de #inserted

    ::Nota. você deve verificar cada instrução e, se precisar recuperar valores de outras tabelas, verifique se os valores são válidos e não nulos.

    se alguém quiser um exemplo. envie-me um e-mail [email protected]

    • 0

relate perguntas

  • SQL Server - Como as páginas de dados são armazenadas ao usar um índice clusterizado

  • Preciso de índices separados para cada tipo de consulta ou um índice de várias colunas funcionará?

  • Quando devo usar uma restrição exclusiva em vez de um índice exclusivo?

  • Quais são as principais causas de deadlocks e podem ser evitadas?

  • Como determinar se um Índice é necessário ou necessário

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve