1


0

SQL Server 2008 r2はトリガーされたときにプロセスを認識しません

SQL Server 2008 R2をマシンにインストールしました(マシンはWindows Server 2003を実行します)db内のテーブルの一部がトリガーを起動し(挿入、削除、更新が発生したとき)、トリガー結果が何らかのプロセス(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;
}

スランクス、リラン。

1 Answer


0


問題は解決しました!!! 実際には許可の問題でした。 トリガーが起動されると、ファイルXP_TRIGGER_SHARED_MEMEORYへの書き込みを試みますが、ここで失敗しました:m_hMap =

OpenFileMappingW(FILE_MAP_WRITE、FALSE、XP_TRIGGER_SHARED_MEMEORY); if(m_hMap == NULL)\ {FALSEを返す; }トリガーは実際にsqlサーバーにロードされたdllをアクティブにし、Sqlサーバーにはahe断片ファイルに書き込む許可がありません(内部のdllを介しても)。

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

somtimeに役立つことを願っています。