Как связать новый скрипт запроса с надстройкой 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
,
Дайте мне знать, если это работает.