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.

Foi útil?

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 ..

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top