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 / 83558
Accepted
pix1985
pix1985
Asked: 2014-11-26 00:56:03 +0800 CST2014-11-26 00:56:03 +0800 CST 2014-11-26 00:56:03 +0800 CST

Gatilho de eliminação de duplicação do SQL Server

  • 772

Eu tenho uma tabela que contém colunas de País, Cidade, Local, Descrição. Devido ao tamanho do campo de descrição, não é possível vincular os quatro campos em uma chave composta para evitar a duplicação. Tenho tentado evitar a duplicação por meio de um gatilho, mas não importa o que eu tente, ele reverte todas as inserções, incluindo inserções de dados exclusivos.

IF Exists ( Select      a.*
            From        [dbo].[Table] a
                JOIN    Inserted b
                    on  a.Country = b.Country
                    and a.City = b.City
                    and a.Location = b.Location
                    and ltrim(rtrim(a.Description)) = ltrim(rtrim(b.Description))
            )


    BEGIN
        Raiserror   ('The description that you are trying to load already exists.', 16, 1)
        Rollback 
    END

Alguém tem alguma ideia do que há de errado com o exposto acima e quais alterações preciso fazer para que ele reverta apenas as inserções duplicadas?

sql-server sql-server-2012
  • 2 2 respostas
  • 1120 Views

2 respostas

  • Voted
  1. vijayp
    2014-11-26T01:47:50+08:002014-11-26T01:47:50+08:00

    Acho que a condição que você está verificando sempre será verdadeira, pois para cada consulta de inserção executada haverá uma entrada no dbo.Tablee insertedtambém reverterá a transação.

    Do MSDN

    A tabela inserida armazena cópias das linhas afetadas durante as instruções INSERT e UPDATE. Durante uma transação de inserção ou atualização, novas linhas são adicionadas à tabela inserida e à tabela acionadora. As linhas na tabela inserida são cópias das novas linhas na tabela de gatilho.

    Aconselho você a verificar a duplicata antes de inserir como

    IF NOT EXISTS (Select a.* FROM [dbo].[Table] a WHERE..............)
      INSERT INTO [dbo].[Table] .......
    

    Mais leituras: http://msdn.microsoft.com/en-in/library/ms191300.aspx

    • 0
  2. Best Answer
    David Spillett
    2014-11-26T02:04:56+08:002014-11-26T02:04:56+08:00

    Eu suspeito que você esteja usando um AFTER INSERTgatilho (se você não especificar outra coisa, os gatilhos são do AFTERtipo, forneça o código completo para sua definição de gatilho para termos certeza), então isso é esperado: seu gatilho dispara após a inserção para que sempre veja a linha que você acabou de colocar.

    Em vez de IF EXISTS ..., você pode fazer IF (SELECT COUNT(*) ...) > 1o que verificará se suas novas linhas trazem o total para mais de um.

    Você também pode usar um INSTEAD OF INSERTgatilho que pode ser um pouco mais eficiente (fazendo menos trabalho que você reverte posteriormente), embora eu duvide que a diferença seja significativa, a menos que você tenha uma carga de trabalho muito pesada de inserção nessa tabela com muitas duplicatas.

    Dois pontos colaterais: em
    primeiro lugar, certifique-se de lidar UPDATESbem ou poderá obter duplicatas dessa maneira também.
    Em segundo lugar, certifique-se de que o que você está fazendo realmente vale a pena: tentar impor a integridade dos dados em campos de entrada de texto livre como "descrição" geralmente é uma causa perdida. Você pode ter duas entradas idênticas, exceto uma com espaço duplo ou erro de ortografia, e sua verificação não as identificará como equivalentes.

    • 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

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

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

    • 4 respostas
  • Marko Smith

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

    • 10 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
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +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

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