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 / 219197
Accepted
SHR
SHR
Asked: 2018-10-04 07:51:42 +0800 CST2018-10-04 07:51:42 +0800 CST 2018-10-04 07:51:42 +0800 CST

Como um gatilho pode ser ignorado?

  • 772

Supondo que eu tenha a seguinte tabela:

Create Table [dbo].[Test_IP]
(
  [IP] varchar(40),
  [IPType] varchar(6)
)

Existem mais triggers nesta tabela, mas todos eles são triggers AFTER, e é um banco de dados grande com muitas tabelas, views e procs armazenados, e tem sido usado em vários processos.

Eu adicionei uma tabela de log e gatilhos como este

Create Table [dbo].[Log_Test_IP]
(
  [Action] varchar(10),
  [IP] varchar(40),
  [IPType] varchar(6)
)
GO
Create Trigger MYTR_Log_Test_IP_INS On [dbo].[Test_IP] After insert AS
BEGIN 
   insert into  [dbo].[Log_Test_IP]([Action],[IP],[IPType]) 
       select 'Insert', [IP], [IPType] from inserted 
END
GO
Create Trigger MYTR_Log_Test_IP_DEL On [dbo].[Test_IP] After delete AS
BEGIN
   insert into  [dbo].[Log_Test_IP]([Action],[IP],[IPType]) 
       select 'Delete', [IP], [IPType] from deleted  
END
GO

Agora estou chegando à parte interessante: quando insiro diretamente na Test_IPtabela, posso ver que o gatilho Insert está funcionando, mas quando funciona regularmente de um aplicativo ou serviço (que não tenho ideia do que faz) não ver qualquer registro de inserção na tabela de log, só consigo ver os registros 'Excluir', mesmo que estivesse vazio no início.

Minha conclusão é que existe alguma maneira de contornar os gatilhos, existem muitos gatilhos e procedimentos armazenados no banco de dados e não tenho ideia de onde procurar.

Então, minha pergunta é como você pode ignorar o gatilho?

sql-server trigger
  • 3 3 respostas
  • 1519 Views

3 respostas

  • Voted
  1. Best Answer
    David Browne - Microsoft
    2018-10-04T09:54:58+08:002018-10-04T09:54:58+08:00

    Os gatilhos não serão executados em alguns cenários.

    1) Obviamente, se o gatilho estiver desabilitado

    2) Se o gatilho estiver marcado como NÃO PARA REPLICAÇÃO e o DML for emitido pelo Agente de Distribuição de replicação.

    3) Se o usuário tiver permissões ALTER TABLE e estiver executando um BULK INSERT, BCP ou SqlBulkCopy, etc com a opção FIRE_TRIGGERS desabilitada.

    • 6
  2. Shaulinator
    2018-10-04T08:51:19+08:002018-10-04T08:51:19+08:00

    Você não pode ignorar um gatilho, ele sempre será acionado com base nos critérios de criação, a menos que seja desativado. Você pode curto-circuitar o gatilho usando objetos temporários ou context_info(), mas com base em sua descrição, isso não é provável.

    Seu gatilho deveria estar disparando, mas não está e isso é um pouco preocupante. Estou pensando que a troca de partição pode até estar em jogo. Eu ficaria longe do profiler ou traces, pois eles estão obsoletos.

    Eu começaria rastreando a atividade na tabela, aqui está um script de evento estendido escrito por Grant Fritchey que capturará todas as consultas ADHOC nessa tabela.

    CREATE EVENT SESSION [QueryPerformance] ON SERVER
    ADD EVENT sqlserver.sql_batch_completed (SET collect_batch_text = (1)
        ACTION (sqlserver.sql_text)
        WHERE ([sqlserver].[equal_i_sql_unicode_string]([sqlserver].[database_name],
                                                        N'AdventureWorks2014')
               AND [sqlserver].[like_i_sql_unicode_string]([batch_text],
                                                           N'%Production.Document%')))
    ADD TARGET package0.event_file (SET filename = N'QueryPerformance');
    

    Fonte do SQL Central escrito por Grant Fritchey - The Scary DBA

    Eu também procuraria capturar os eventos que atualizam ou inserem a tabela nos logs de auditoria.

    Nic do Stack Overflow escreveu o código abaixo:

    USE [master]
    
    GO
    
    CREATE SERVER AUDIT [Audit-TblChanges]
    TO FILE 
    (   FILEPATH = N'C:\SQLAudit'
        ,MAXSIZE = 0 MB
        ,MAX_ROLLOVER_FILES = 2147483647
        ,RESERVE_DISK_SPACE = OFF
    )
    WITH
    (   QUEUE_DELAY = 1000
        ,ON_FAILURE = CONTINUE
    )
    
    GO
    
    USE [YourDatabase]
    GO
    
    CREATE DATABASE AUDIT SPECIFICATION [DatabaseAuditSpecification-MyTable]
    FOR SERVER AUDIT [Audit-TblChanges]
    ADD (UPDATE ON OBJECT::[YourTable] BY [public]),
    ADD (INSERT ON OBJECT::[YourTable] BY [public])
    
    GO
    
    
    USE [master]
    GO
    ALTER SERVER AUDIT [Audit-TblChanges] WITH (STATE = ON);
    
    USE [YourDatabase]
    GO
    ALTER DATABASE AUDIT SPECIFICATION [DatabaseAuditSpecification-MyTable] WITH (STATE = ON);
    GO
    

    Fonte de código SQL Audit por Nic of Stack Overflow source.

    Como último recurso, eu procuraria ler todos os procedimentos armazenados e examinar qualquer coisa que fizesse referência a essa tabela.

    Chains from stack overflow tem um pequeno trecho para você e mais aqui para determinar as tabelas que estão sendo usadas em procedimentos armazenados.

    Como sempre, teste isso em um ambiente de desenvolvimento e propague para produção com cuidado e controle de qualidade adequado.

    Mais uma vez, obrigado Grant , Chains e Nic por suas contribuições!

    • 1
  3. mija
    2018-10-04T08:25:47+08:002018-10-04T08:25:47+08:00

    Você pode tentar com o SQL Server Profiler e ver o que está acontecendo com o aplicativo. O evento SP:StmtCompleted deve ser adicionado ao rastreamento

    • 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