1

SQL Server 2008 R2を自分のマシンにインストールしました(自分のマシンはWindows Server 2003を実行しています)データベース内のいくつかのテーブルがトリガーを起動しています(挿入、削除、更新が発生した場合)トリガー結果は何らかのプロセス(triggersReceiver.exe)に到達するはずですトリガーを待機する共有メモリ経由)。問題は、SQL Server 2008 r2が、トリガーが起動したときに発生するエラー、triggersReceiver.exeが実行されていないこのプロセスを認識しないことです。しかし、彼は走っています!!!!! 以前に同様の問題に直面した人はいますか?

これは、トリガーが起動されるたびに実行される「コネクタ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、リラン。

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サーバーにロードされたdllをアクティブにし、SQLサーバーにはシャードファイルに書き込むためのアクセス許可がありません(その中のdllを介しても)。

これを解決するには、SQLサーバーに権限を与える必要があります。[MyComputer]->[管理]->[サービスとアプリケーション]->[サービス]: ForEach SQLサービス:(右側のリスト)1。右クリック-> [プロパティ]->[ログオン]タブ->[ローカルシステムアカウント]に変更します。

それがいつか役立つことを願っています。

于 2010-09-27T14:21:24.033 に答える