2016-09-26 5 views
1

SQL CLRトリガーを使用して、リレーショナルDBからMongoDBインスタンスへの更新をプッシュしています。両方のデータベースが同じWindows 2012マシンで実行されています。SQL Server 2008のCLRトリガーからMongoDBにアクセスする

私のSQL CLRプロジェクトは、.NET 3.5上に構築され、mongocsharpdriver 1.10.0を使用しています。次のように私のトリガー内

C#コードは次のとおり

SqlPipe pipe = SqlContext.Pipe; 
pipe.Send("Begin ReportUpdateTrigger.VTProperty"); 

try 
{ 
    var settings = new MongoClientSettings(); 
    settings.Server = new MongoServerAddress("127.0.0.1", 27017); 

    var client = new MongoClient(settings); 
    var server = client.GetServer(); 

    var db = server.GetDatabase("VTProperty"); 
    var coll = db.GetCollection<object>("Property"); 

    var item = new { name = "test", datecreated = DateTime.Now }; 
    coll.Insert(item); 
} 
catch (Exception ex) 
{ 
    pipe.Send("Error sending update to Reporting database: " + ex.Message); 
} 

pipe.Send("Done ReportUpdateTrigger.VTProperty"); 

(これは単なるMongoDBの操作が動作することを確認するためのテストコードです)。

私は別のコンソールアプリケーションから全く同じコードを実行し、データは問題なくMongoに投稿されます。

トリガーから実行しているとき、私は次のエラーを参照してください。

Begin ReportUpdateTrigger.VTProperty Error sending update to Reporting database: Unable to connect to server 127.0.0.1:27017: The type initializer for 'MongoDB.Bson.Serialization.BsonSerializer' threw an exception.. Done ReportUpdateTrigger.VTProperty

は、私は私のDLLを持っている(とMongoDBのドライバを含むすべてのサポートのDLLは、)DBサーバ内のアセンブリとして参照。 CLRが有効です。 SQL出力ウィンドウにカスタムステータスとエラーメッセージが表示されるため、トリガーが実行されていることがわかります。

私の勘違いは、どのユーザー/プロセスが実行されていても、トリガーコードはMongoインスタンスにアクセスできないということです。したがって、 "サーバーに接続できません127.0.0.1:27017"エラー。私の次のステップは何であるべきかわからない。デフォルトでは

答えて

0

は、SQLCLR外部からのアクセスは、MSSQLSERVERサービス(またはMSSQL $ InstanceNameは、またはそのようなもの)の(アカウント「としてログオン」、すなわち)サービスアカウントのセキュリティコンテキストを持っています。そのサービスアカウントは、デフォルトではローカルシステムアカウントです。あなたのMSSQLSERVERサービスアカウントとして「ローカルシステム」を使用している場合は、実際のローカルまたはドメイン/ ADアカウントを作成し、サービスアカウントことを確認、

  1. :あなたはここで2つのいずれかを行うことができます。次に、新しい実際のアカウントがMongoDBにアクセスできることを確認してください。

    何も関係なく、SQL Serverなどのサービスに独自のサービスアカウントを使用することをお勧めします。これにより、パーマネントを簡単に制御して制限することができます。

  2. Windowsログインを使用している場合は、.NETコードで偽装を有効にするオプションがあります。偽装を使用すると、外部呼び出しのセキュリティコンテキストは、SQLCLRオブジェクトを実行しているWindowsログインに設定されます。このため

    、あなたのコードに次のようなものを追加する必要があります。

    using System.Security.Principal; 
    
    // above the "try" block 
    WindowsImpersonationContext _ImpersonationIdentity = null; 
    
    // inside the "try", before anything else 
    _ImpersonationIdentity = SqlContext.WindowsIdentity.Impersonate(); 
    
    // in a "finally" block 
    if (_ImpersonationIdentity != null) 
    { 
        _ImpersonationIdentity.Undo(); 
    } 
    
+0

私はSQL Serverサービスがもとで実行するユーザーを変更しました。これはローカルユーザーであり、Administratorsグループのメンバーです(初期テスト用)が、同じエラーが発生しています。 SSCMを使用してユーザーアカウントを変更し、サービスが停止または再開され、変更が有効であることが確認されました。 SQLユーザーがローカル管理者の場合、他にmongoインスタンスにアクセスできない可能性がありますか? –

+0

@KyleSullensサービスアカウントを変更しましたが、偽装を使用していませんか?偽装を実装している場合、サービスアカウントは問題ではなく、SQL Server内のSQLCLRオブジェクトを実行しているログインだけで問題ありません。偽装を使用していない場合は、MongoDBに接続してこのローカルユーザと動作していることを証明してください。また、私はちょうどエラーメッセージを読んで、それは型の初期化子から来ている?その場合、おそらく偽装は使用できません。私は型初期化コードが何をしているのだろうか。接続エラーを示すMongoDBエラーログはありますか? –

関連する問題