2010-09-27 105 views
1

我已经安装了SQL Server 2008 R2在我的机器上(我的机器运行的是windows server 2003) 我的数据库中的一些表是触发触发器(当插入,删除,更新发生) 触发结果应该达到一些等待触发器的进程(通过共享内存的triggersReceiver.exe)。 问题是SQL Server 2008 R2无法识别这个过程,当触发器触发时我得到的错误: triggersReceiver.exe未运行。 但他跑了!!!!! 是任何人在面对类似的问题之前?Sql Server 2008 R2在触发时无法识别进程

这是“连接器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

你应该发布一些代码。 – devio 2010-09-27 09:37:54

+0

当您发布代码时,您可以选择全部,然后使用'100100100'按钮进行正确格式化。 – 2010-09-27 10:24:22

+0

对不起,下次我会.. :) – Liran 2010-09-27 10:39:06

回答

0

问题解决了! 它实际上是一个权限问题。 当触发器触发它试图写入文件XP_TRIGGER_SHARED_MEMEORY 它在这里失败: m_hMap = :: OpenFileMappingW(FILE_MAP_WRITE,FALSE,XP_TRIGGER_SHARED_MEMEORY); (m_hMap == NULL) { return FALSE; } 触发器实际上激活了加载到sql服务器的dll,并且Sql服务器 没有任何权限(通过它内部的dll)写入到分片文件。

为了解决这个问题,你需要给SQL Server中permmisions

: 右键点击我的电脑 - >管理 - >服务和应用程序 - >服务: 的ForEach SQL服务:(在右边的列表) 1.右键点击它 - >属性 - >登录选项卡 - >切换到本地系统帐户。

希望它能帮助somtime ..