SQL Server 2008 R2 não reconhece o processo quando acionado
-
25-09-2019 - |
Pergunta
Eu instalei o SQL Server 2008 R2 na minha máquina (minha máquina executa o Windows Server 2003) Algumas das tabelas dentro do meu banco de dados estão disparando gatilhos (quando inserir, excluir, atualizar) o resultado do gatilho que deve atingir algum processo (TriggersReceiver.exe via memória compartilhada) que aguarda os gatilhos. O problema é que o SQL Server 2008 R2 não reconhece esse processo o erro que recebo quando o gatilho dispara: gatriggersreceiver.exe não está em execução. Mas ele está correndo !!!!! Alguém já enfrentou um problema semelhante antes?
Esse é o código que da "DLL do conector", a parte que executa sempre que um gatilho for disparado (esse código é executado por meio de procedimento armazenado estendido): toda a funcionalidade é encontrada no winbase.h (DLL Windows)
////////Defenitions///////////////////////////////////////////////////////
#define XP_TRIGGER_SHARED_MEMEORY L"Global\\xp_trigger_shared_memory"
#define XP_TRIGGER_PROCESS_EVENT L"Global\\xp_trigger_process_event"
#define XP_TRIGGER_DONE_EVENT L"Global\\xp_trigger_done_event"
////////////////////////////////////////////////////////////////////////////
Esta função retorna falsa (não sei por que ...)
BOOL CTriggerGatewayConnector::Init()
{
::InitializeCriticalSection(&m_CS);
m_hMap = ::OpenFileMappingW(FILE_MAP_WRITE, FALSE, XP_TRIGGER_SHARED_MEMEORY);
if (m_hMap == NULL)
{
return FALSE;
}
m_pSqlTrigInfo = (SqlTriggerInfo*)::MapViewOfFile(
m_hMap, FILE_MAP_WRITE, 0, 0,sizeof (SqlTriggerInfo));
if (m_pSqlTrigInfo == NULL)
{
return FALSE;
}
m_hProcess = ::CreateEventW(NULL, FALSE, FALSE, XP_TRIGGER_PROCESS_EVENT);
if (m_hProcess == NULL)
{
return FALSE;
}
m_hDone = ::CreateEventW(NULL, FALSE, FALSE, XP_TRIGGER_DONE_EVENT);
if (m_hDone == NULL)
{
return FALSE;
}
return TRUE;
}
Thnanks, Liran.
Solução
O problema resolvido !!! Na verdade, era um problema de permissão. Quando o gatilho disparou, ele tenta gravar no arquivo xp_trigger_shared_memeory e falhou aqui: m_hmap = :: openFilemappingw (file_map_write, false, xp_trigger_shared_memeory); if (m_hmap == null) {return false; } O gatilho realmente ativou a DLL que foi carregada no SQL Server, e o SQL Server não tem permissão (teven através da DLL dentro dele) para gravar no arquivo shard.
Para resolvê -lo, você precisa dar ao SQL Server as permissões: Clique com o botão direito do myComputer -> Gerenciar -> Serviços e Aplicativos -> Serviços:Para cada Serviço SQL: (Na lista à direita) 1. Clique com o botão direito do mouse nele -> Propriedades -> Guia Logon -> Altere na conta do sistema local.
Espero que ajude SomTime ..