Как связать новый скрипт запроса с надстройкой SSMS?

Я пытаюсь создать надстройку SSMS. Одна из вещей, которые я хочу сделать, - создать новое окно запроса и программно подключить его к экземпляру сервера (в контексте входа в систему SQL). Я могу просто создать окно нового скрипта запроса, но не могу найти, как его подключить, предварительно не подключившись вручную к чему-то другому (например, к Object Explorer).

Другими словами, если я подключаю Obect Explorer к экземпляру SQL вручную, а затем выполняю метод моей надстройки, которая создает окно запроса, я могу подключить его с помощью этого кода:

ServiceCache.ScriptFactory.CreateNewBlankScript(
     Editors.ScriptType.Sql,
     ServiceCache.ScriptFactory.CurrentlyActiveWndConnectionInfo.UIConnectionInfo,
     null);

Но я не хочу полагаться на CurrentActiveWndConnectionInfo.UIConnectionInfo для подключения. Я хочу программно установить имя пользователя и пароль для входа в SQL.

У кого-нибудь есть какие-либо идеи?

РЕДАКТИРОВАТЬ:

Мне удалось подключить окно запроса, установив последний параметр для экземпляра System.Data.SqlClient.SqlConnection. Тем не менее, соединение использует контекст последнего входа в систему, который был подключен вместо того, что я пытаюсь установить программно. То есть пользователь, к которому он подключается, - это тот, который выбран в диалоге подключения, который вы получаете, когда нажимаете кнопку "Новый запрос" и у вас нет подключенного обозревателя объектов.

EDIT2:

Я пишу (или надеюсь написать) надстройку для автоматической отправки оператора SQL и результатов выполнения в нашу систему отслеживания дел при запуске на наших производственных серверах. Одна мысль, которая у меня была, заключалась в том, чтобы удалить разрешения на запись и назначить логины через эту надстройку, что также вынудит пользователя вводить регистр # отменяя инструкцию, если ее там нет. Еще одна мысль, которую я только что сделал, - это проверить имя сервера в ServiceCache.ScriptFactory.CurrentlyActiveWndConnectionInfo.UIConnectionInfo и сравнить его с нашим списком рабочих серверов. Если оно совпадает, а № дела нет, отмените запрос.

3 ответа

Решение

Я не нашел способа сделать это, так как, похоже, нет способа подключиться к диалоговому окну подключения.

над чем ты работаешь?

РЕДАКТИРОВАТЬ: Если я правильно понимаю, вы хотите перехватить выполняемый запрос, и если он соответствует производственному серверу, отменить его, иначе отправить текст и результаты в БД? хм... хотя это было бы возможно, но это действительно большая боль в спине, и я бы не использовал надстройку для этого. Кроме того, надстройку можно отключить, удалить и т. д., попробуйте сделать это с правильной настройкой безопасности на рабочем сервере.

На всякий случай, если кто-то еще ищет способ программно создать и подключить окно запроса - короткий пример для 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,

Дайте мне знать, если это работает.

Другие вопросы по тегам