2010-09-27 58 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 ..