我在我的机器上安装了SQL Server 2008 R2(我的机器运行的是Windows Server 2003) 我的数据库中的一些表是触发触发器(当插入,删除,更新发生时) 触发结果应该到达某个等待触发器的进程(triggersReceiver.exe通过共享内存)。 问题是SQL Server 2008 r2无法识别此过程触发器触发时出现的错误: triggersReceiver.exe未运行。 但他正在跑步!!!!! 在任何人面临类似问题之前?
这是触发器触发时执行的部件“connector 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;
}
Thnanks, 丽然
答案 0 :(得分:0)
解决问题!!! 它实际上是一个许可问题。 当触发器触发时,它尝试写入文件XP_TRIGGER_SHARED_MEMEORY 它失败了: m_hMap = :: OpenFileMappingW(FILE_MAP_WRITE,FALSE,XP_TRIGGER_SHARED_MEMEORY); if(m_hMap == NULL) { 返回FALSE; } 触发器实际上激活了加载到sql server和sql server的dll 没有任何权限(通过它内部的dll)写入分片文件。
为了解决它你需要给sql server permisions: 右键单击MyComputer - >管理 - >服务和应用程序 - >服务 : ForEach SQL服务:(在右侧列表中) 1.右键单击它 - >属性 - > LogOn选项卡 - >更改为本地系统帐户。
希望它能帮助您节省时间。