1

我已经在我的机器上安装了 SQL Server 2008 R2(我的机器运行 Windows Server 2003)我的数据库中的一些表正在触发触发器(当插入、删除、更新发生时)触发器结果应该到达某个进程(triggersReceiver.exe通过共享内存)等待触发器。问题是 SQL Server 2008 r2 无法识别此过程触发器触发时我得到的错误: triggersReceiver.exe is not running 。但他在跑!!!!有没有人遇到过类似的问题??

这是“连接器 dll”的代码,该部分在触发触发器时执行(此代码通过扩展存储过程执行):所有功能都在 winbase.h(windows dll)中找到

////////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"
////////////////////////////////////////////////////////////////////////////

这个函数返回 FALSE(我不知道为什么......)

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;
}

谢谢,立然。

4

1 回答 1

0

问题解决了!!!这实际上是一个权限问题。当触发器触发时,它会尝试写入文件 XP_TRIGGER_SHARED_MEMEORY 并且在此处失败: m_hMap = ::OpenFileMappingW(FILE_MAP_WRITE, FALSE, XP_TRIGGER_SHARED_MEMEORY); if (m_hMap == NULL) { 返回 FALSE; 触发器实际上激活了加载到sql server的dll,而sql server没有任何权限(甚至通过里面的dll)写入ahe shard文件。

为了解决它,您需要给 sql server 权限:右键单击 MyComputer -> 管理 -> 服务和应用程序 -> 服务: ForEach SQL 服务:(在右侧列表中) 1. 右键单击​​它 ->属性 -> 登录选项卡 -> 更改为本地系统帐户。

希望它会有所帮助..

于 2010-09-27T14:21:24.033 回答