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"エラー。私の次のステップは何であるべきかわからない。デフォルトでは
私はSQL Serverサービスがもとで実行するユーザーを変更しました。これはローカルユーザーであり、Administratorsグループのメンバーです(初期テスト用)が、同じエラーが発生しています。 SSCMを使用してユーザーアカウントを変更し、サービスが停止または再開され、変更が有効であることが確認されました。 SQLユーザーがローカル管理者の場合、他にmongoインスタンスにアクセスできない可能性がありますか? –
@KyleSullensサービスアカウントを変更しましたが、偽装を使用していませんか?偽装を実装している場合、サービスアカウントは問題ではなく、SQL Server内のSQLCLRオブジェクトを実行しているログインだけで問題ありません。偽装を使用していない場合は、MongoDBに接続してこのローカルユーザと動作していることを証明してください。また、私はちょうどエラーメッセージを読んで、それは型の初期化子から来ている?その場合、おそらく偽装は使用できません。私は型初期化コードが何をしているのだろうか。接続エラーを示すMongoDBエラーログはありますか? –