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 / 211447
Accepted
SHR
SHR
Asked: 2018-07-06 06:18:25 +0800 CST2018-07-06 06:18:25 +0800 CST 2018-07-06 06:18:25 +0800 CST

TRUNCATE TABLE pode ser sobrecarregado no SQL Server?

  • 772

Eu sei que pode parecer uma pergunta estranha...

Eu tenho um banco de dados e serviços de terceiros e quero monitorá-lo por gatilhos DML em e INSERTde cada tabela.UPDATEDELETE

Mas infelizmente, estou com um problema quando TRUNCATE TABLEé chamado, pois não está ativando os DELETEgatilhos.

Estou procurando uma maneira de "sobrecarregar" o TRUNCATE TABLEpara ser algo como:

DELETE FROM X; --remove all rows
TRUNCATE TABLE X; --truncate the empty table

Ou talvez ative algum gatilho DDL antes de truncar, para que eu possa verificar quais linhas serão truncadas.

Ficarei feliz se houver outras propostas também.

Algo assim é possível?

EDITAR

Eu não quero desabilitar o truncateque eu só quero monitorar os dados.

É um banco de dados de terceiros e foi usado por serviços sobre os quais não posso controlar, portanto, não posso impedir que o truncate.

Estou apenas tentando monitorar as alterações e atualmente não consigo rastrear a exclusão de registros causada pelo truncatecomando.

Obrigado!

sql-server truncate
  • 1 1 respostas
  • 1313 Views

1 respostas

  • Voted
  1. Best Answer
    Shaulinator
    2018-07-06T06:27:03+08:002018-07-06T06:27:03+08:00

    Estou procurando uma maneira de "sobrecarregar" a TRUNCATE TABLE para ser algo como:

    APAGAR DE X; --remove todas as linhas TRUNCATE TABLE X; --truncar a tabela vazia

    Ao excluir de uma tabela, você está removendo linhas. Você pode especificar quais linhas excluir com uma WHEREcláusula. Quando você TRUNCATEcria uma tabela, ela não registra quais linhas são excluídas e executa um registro mínimo. TRUNCATEé uma ótima maneira de limpar uma tabela sem causar um balão nos logs de transações.

    Ou talvez ative algum gatilho DDL antes de truncar, para que eu possa verificar quais linhas serão truncadas.

    Você não precisa de um gatilho para isso. A TRUNCATEremoverá todas as linhas da tabela, você sabe que todas as linhas serão removidas no processo. Sem sobreviventes.

    Se você quiser capturar o evento para saber quem truncou o quê ou quando, você pode fazer isso com o SQL Audit, conforme mostrado por Mohd Sufian no SQL Ship .

    Eu não acredito que você possa disparar o gatilho de um Truncate, aqui está a lista DDL no MSDN de quais eventos DDL podem ser disparados de um gatilho.

    Você também pode usar eventos estendidos para capturar Truncateeventos como mostra Jonathan Kehayias no MSDN.

    Se você deseja impedir que os usuários executem Truncate, você pode criar uma exibição ou outro objeto com SCHEMABINDING. Isso evita que as instruções DDL alterem a tabela em questão, que inclui Truncate.

    Uma última observação Truncateé que, se você tiver uma coluna de identidade, ela propagará novamente o valor. Já vi pessoas usarem a RESEEDfunção e Truncatejuntas. Eles irão capturar a última identidade usada, armazená-la em uma tabela de variáveis, truncar a tabela removendo todos os registros com log mínimo e redefinindo a coluna de identidade, então propagarão novamente o último incremental. Normalmente, se você truncar, não se importa com a nova semente. (Nem sempre é verdade, mas geralmente.)

    Eu trunco ​​principalmente em tabelas de preparo ou quando preciso redefinir uma instância para teste. Raramente trunco ​​tabelas de outra forma porque me importo com a integridade dos dados referenciais e quais linhas são removidas das tabelas. Quando eu não me importo com nenhum, eu trunco.

    Eu recomendo ler mais sobre ambos Deletee Truncate, eles alcançarão resultados semelhantes, mas são duas coisas muito diferentes.

    Atul Gaikwad em MSSQLTips escreveu um artigo rápido e agradável sobre algumas dessas diferenças.

    Agora vejamos esta questão:

    Posso contar as linhas que serão afetadas pelo truncar de um aplicativo de terceiros?

    Idealmente, o evento de truncar é agendado ou pode ser planejado. Ainda mais idealmente, você poderá alterar o código ou adicionar algo para que ele possa registrar informações para você. A partir do seu post, vou assumir que você não pode planejar, agendar ou alterar o código.

    Então, como você controla quais linhas serão afetadas por truncar se necessário, com absoluta certeza?

    Eu pessoalmente criaria duas tabelas, uma trigger e uma procedure.

    O gatilho seria baseado em tarefas de inserção ou exclusão e inseriria em uma tabela o número de linhas afetadas, o nome da tabela e a data e hora. Portanto, se o seu processo inserisse 6 linhas, o gatilho inseriria o valor 6, indicando que 6 novos registros entraram. Se você excluísse 10 linhas, ele inseriria um valor de -10, indicando que 10 registros desapareceram.

    Eu gostaria de criar uma coluna extra para notas ou eventos. Eu gostaria que os eventos de auditoria ou estendidos registrassem nesta tabela o dia/hora em que o truncado ocorreu. Eles não poderão dizer quantas linhas, mas podem dizer quando e quem. Isso é o que é realmente importante neste momento.

    A segunda tabela seria um agregado da primeira tabela, pois suponho que você possa ter muitas transações em um dia. Isso informaria o total líquido de registros no final do dia e também informaria quando ocorreram truncamentos. Isso significa que você saberia quantos registros estavam na tabela antes do truncamento, atendendo aos seus requisitos.

    O procedimento faria a agregação entre as tabelas e também realizaria o trabalho de limpeza na primeira tabela.

    • 5

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