新しいクエリスクリプトをSSMSアドインに接続する方法は?
-
06-07-2019 - |
質問
SSMSアドインを作成しようとしています。私がやりたいことの1つは、新しいクエリウィンドウを作成し、プログラムでサーバーインスタンスに(SQLログインのコンテキストで)接続することです。新しいクエリスクリプトウィンドウは問題なく作成できますが、最初に手動で他のもの(オブジェクトエクスプローラーなど)に接続しない限り、接続方法を見つけることができません。
つまり、Obect ExplorerをSQLインスタンスに手動で接続し、クエリウィンドウを作成するアドインのメソッドを実行すると、次のコードを使用して接続できます。
ServiceCache.ScriptFactory.CreateNewBlankScript(
Editors.ScriptType.Sql,
ServiceCache.ScriptFactory.CurrentlyActiveWndConnectionInfo.UIConnectionInfo,
null);
しかし、接続についてCurrentlyActiveWndConnectionInfo.UIConnectionInfoに依存したくありません。プログラムでSQLログインのユーザー名とパスワードを設定したい。
アイデアはありますか?
編集:
最後のパラメーターをSystem.Data.SqlClient.SqlConnectionのインスタンスに設定することにより、クエリウィンドウを接続することができました。ただし、接続は、プログラムで設定しようとしているものではなく、最後に接続されたログインのコンテキストを使用します。つまり、接続するユーザーは、[新しいクエリ]ボタンをクリックしたときに表示される接続ダイアログで選択されたユーザーであり、オブジェクトエクスプローラーは接続されていません。
EDIT2:
アドインを作成(または作成を希望)して、実稼働サーバーに対して実行したときに、SQLステートメントと実行結果をケース追跡システムに自動的に送信します。私が考えていたのは、書き込み許可を削除し、このアドインを介してログインを割り当てることでした。これにより、ユーザーはケース#を入力し、ステートメントがない場合はキャンセルします。もう1つの考えは、ServiceCache.ScriptFactory.CurrentlyActiveWndConnectionInfo.UIConnectionInfoのサーバー名を調べて、それを運用サーバーのリストと比較することです。一致し、ケース番号がない場合は、クエリをキャンセルします。
解決
接続ダイアログウィンドウにフックする方法がないように見えるため、これを行う方法を見つけていません。
何に取り組んでいますか
編集: 私が正しく理解している場合は、実行中のクエリを傍受し、それが本番サーバーと一致する場合はキャンセルし、それ以外の場合はテキストと結果をデータベースに送信しますか? うーん...これは可能ですが、背後にある本当の大きな痛みであり、これにはアドインを使用しません。さらに、アドインを無効にしたり、アンインストールしたりできます。 運用サーバーで適切なセキュリティを設定してこれを実行することをお勧めします。
他のヒント
他の誰かがプログラムでクエリウィンドウを作成して接続する方法を探している場合に備えて-SSMS 2012の簡単な例:
UIConnectionInfo u =new UIConnectionInfo();
u.ServerName = "TestPC\\ServerInstance";
u.ServerType = new Guid("8c91a03d-f9b4-46c0-a305-b5dcc79ff907");
u.AuthenticationType = 0;//Use AuthenticationType = 1 for SQL Server Authentication
u.AdvancedOptions.Set("DATABASE", "AdventureWorks2012");
IScriptFactory scriptFactory = ServiceCache.ScriptFactory;
if(scriptFactory != null)
{
scriptFactory.CreateNewBlankScript(ScriptType.Sql, u, null);
}
このコードスニペットは、指定されたサーバーとデータベースに接続された新しいクエリウィンドウをWindows認証で開きます。
まだ試したことはありませんが、試してみたかどうかわかりませんでした。
Microsoft.SqlServer.Management.Smo.RegSvrEnum.UIConnectionInfo u =
new Microsoft.SqlServer.Management.Smo.RegSvrEnum.UIConnectionInfo();
自分で接続できるようにする必要があります。しかし、私が言ったように、私はまだそれをテストしていません。
Microsoft.SqlServer.RegSvrEnum.dll
への参照が必要です。
動作するかどうか教えてください。