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 / 2376
Accepted
datagod
datagod
Asked: 2011-04-27 07:03:38 +0800 CST2011-04-27 07:03:38 +0800 CST 2011-04-27 07:03:38 +0800 CST

Como determinar o nome de um processo que causou o disparo de um gatilho

  • 772

Versão curta: Alguém conhece uma maneira - dentro de um gatilho SQL 2000 - de detectar qual processo modificou os dados e sair do gatilho se um processo específico for detectado?

Versão longa Eu tenho uma rotina de sincronização personalizada que move dados para frente e para trás entre esquemas de banco de dados diferentes.

Quando este processo pega um registro modificado do Banco de Dados A, ele precisa transformá-lo em um registro que vai para o Banco de Dados B. Os bancos de dados são radicalmente diferentes, mas compartilham alguns dos mesmos dados, como contas de usuário e atividade do usuário (no entanto, mesmo essas tabelas são estruturalmente diferentes).

Quando os dados são modificados em uma das tabelas pertinentes, um gatilho é acionado que grava o PK desse registro em uma tabela "sincronizada". Esta tabela "sync" é monitorada por um processo (um stored proc) que irá capturar os PK's em sequência, e copiar os dados relacionados do banco de dados A para o banco de dados B, fazendo as transformações necessárias.

Ambos os bancos de dados possuem triggers que disparam e copiam o PK para a tabela de sincronização, porém essas triggers devem ignorar o próprio processo de sincronização para não entrar em loop "sem fim" (ou menos, dependendo dos limites de aninhamento).

No SQL 2005 e superior, uso o seguinte código no processo de sincronização para se identificar:

SET CONTEXT_INFO 0xHexValueOfProcName

Cada gatilho tem o seguinte código no início, para ver se o processo que modificou os dados é o próprio processo de sincronização:

SE (CONTEXT_INFO() = 0xHexValueOfProcName)
COMEÇAR
-- print '## Process Sync Queue detectado. Este gatilho está saindo! ##'
  Retorna
FIM

Este sistema funciona muito bem, continue trabalhando, mantém os dados sincronizados. O problema agora, porém, é que um servidor SQL2000 deseja entrar na festa.

Alguém conhece uma maneira - dentro de um gatilho SQL 2000 - de detectar qual processo modificou os dados e sair do gatilho se um determinado processo for detectado?

Obrigado rapazes!

sql-server-2000
  • 1 1 respostas
  • 409 Views

1 respostas

  • Voted
  1. Best Answer
    gbn
    2011-04-27T08:23:15+08:002011-04-27T08:23:15+08:00

    SET CONTEXT_INFO também existe para SQL Server 2000.

    No entanto, você deve consultar sysprocesses.context_infopara lê-lo de volta. CONTEXT_INFO()era novo para o SQL Server 2005.

    • 4

relate perguntas

  • Erro ao mover SQL Server 2000 para SQL Server 2005 Erro NOLOCK

  • SQL Server 2000: listar e desativar todos os gatilhos

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