web-dev-qa-db-ja.com

SQL Server Management Studioの[サーバーに接続]画面でサーバーエントリを削除する方法

可能性のある複製:
SQL Server Management Studioの履歴から「サーバー名」の項目を削除する方法

[サーバーへの接続]画面で、SQL Server Management Studioは、サーバー名、ログイン、パスワードに入力したすべてのエントリを保存します。これは非常に役立ちますが、時々状況が変化し、サーバーがアドレスを変更し、データベースが利用できなくなります。

この画面からサーバーエントリを削除するにはどうすればよいですか?また、サーバーを選択すると、過去のログインがリストに表示されます。もう一度、これらの変化。ユーザーエントリを削除するにはどうすればよいですか?

Connect to Server screen

34

このファイルはMicrosoft.SqlServer.Management.UserSettings、Version = 10.0.0.0、Culture = neutral、PublicKeyToken = 89845dcd8080cc91アセンブリで定義されているMicrosoft.SqlServer.Management.UserSettings.SqlStudioクラスのバイナリシリアル化バージョンであるように見えますc:\ Program Files\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\Microsoft.SqlServer.Management.UserSettings.dll)。

少しの開発スキル(Visual StudioまたはPowershell)で、このファイルを元のクラスに逆シリアル化し、削除するエントリを見つけて、ファイルを再シリアル化できます。

これはあなたにアイデアを与えるはずです(.binファイルのコピーで作業する)...

var binaryFormatter = new BinaryFormatter();
var inStream = new MemoryStream(File.ReadAllBytes(@"c:\temp\SqlStudio.bin"));
var settings = (SqlStudio) binaryFormatter.Deserialize(inStream);
foreach (var pair in settings.SSMS.ConnectionOptions.ServerTypes)
{
    ServerTypeItem serverTypeItem = pair.Value;
    List<ServerConnectionItem> toRemove = new List<ServerConnectionItem>();
    foreach (ServerConnectionItem server in serverTypeItem.Servers)
    {
        if (server.Instance != "the server you want to remove")
        {
            continue;
        }
        toRemove.Add(server);
    }
    foreach (ServerConnectionItem serverConnectionItem in toRemove)
    {
        serverTypeItem.Servers.RemoveItem(serverConnectionItem);
    }
}

MemoryStream outStream = new MemoryStream();
binaryFormatter.Serialize(outStream, settings);
byte[] outBytes = new byte[outStream.Length];
outStream.Position = 0;
outStream.Read(outBytes, 0, outBytes.Length);
File.WriteAllBytes(@"c:\temp\SqlStudio.bin", outBytes);

エイドリアンの質問の後、私はVisual Studio 2010を使用してWin7 x64ボックスでこれをもう一度試しました。同じエラーを見つけたので、少し掘り下げた後、解決するためにいくつかの手順を実行したことがわかりました。

  1. プロジェクトプロパティでプラットフォームターゲットを「x86」に設定します
  2. microsoft.SqlServer.Management.SDK.SqlStudioへの参照を追加します(私のボックスでは、これはc:\ Program Files\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\Microsoft.SqlServer.Management.Sdk。 SqlStudio.dll)
  3. microsoft.SqlServer.Management.UserSettingsへの参照を追加します(前のものと同じディレクトリにあります)
  4. カスタムアセンブリ解決を実行する

カスタムアセンブリの解決は、CLRがアセンブリを正しく解決しない理由や、Visual Studioで参照を手動で追加できない理由が(少なくとも私には)明らかではないため、少し時間がかかりました。私はSqlWorkbench.Interfaces.dllについて話している。

更新されたコードは次のようになります。

internal class Program
    {
        static void Main(string[] args)
        {
            AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;

            var binaryFormatter = new BinaryFormatter();
            var inStream = new MemoryStream(File.ReadAllBytes(@"c:\temp\SqlStudio.bin"));
            var settings = (SqlStudio) binaryFormatter.Deserialize(inStream);
            foreach (var pair in settings.SSMS.ConnectionOptions.ServerTypes)
            {
                ServerTypeItem serverTypeItem = pair.Value;

                List<ServerConnectionItem> toRemove = new List<ServerConnectionItem>();
                foreach (ServerConnectionItem server in serverTypeItem.Servers)
                {
                    if (server.Instance != "the server you want to remove")
                    {
                        continue;
                    }
                    toRemove.Add(server);
                }
                foreach (ServerConnectionItem serverConnectionItem in toRemove)
                {
                    serverTypeItem.Servers.RemoveItem(serverConnectionItem);
                }
            }


            MemoryStream outStream = new MemoryStream();
            binaryFormatter.Serialize(outStream, settings);
            byte[] outBytes = new byte[outStream.Length];
            outStream.Position = 0;
            outStream.Read(outBytes, 0, outBytes.Length);
            File.WriteAllBytes(@"c:\temp\SqlStudio.bin", outBytes);
        }

        private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args)
        {
            Debug.WriteLine(args.Name);
            if (args.Name.StartsWith("SqlWorkbench.Interfaces"))
            {
                return Assembly.LoadFrom(@"C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\SqlWorkbench.Interfaces.dll");
            }
            return Assembly.Load(args.Name);
        }
    }
40
arcticdev

残念ながら、特定のアイテムのみを削除することは不可能(または少なくとも実用的)ではないようです。

ただし、必要に応じて、構成をリセットして最初から始めることができます。

Management Studioが閉じていることを確認してから、このファイルを削除または名前を変更します。

%APPDATA%\Microsoft\Microsoft SQL Server\100\Tools\Shell\SqlStudio.bin

このファイルには他のユーザー設定が含まれているため、Management Studio構成をカスタマイズしている場合は、それらを復元するための作業が必要になります。

参照: http://social.msdn.Microsoft.com/Forums/en-US/sqltools/thread/94e5c3ca-c76d-48d0-ad96-8348883e8db8/

幸運を!

3
Michael Ames