Как подключить новый скрипт запроса к надстройке SSMS?
-
06-07-2019 - |
Вопрос
Я пытаюсь создать надстройку SSMS.Одна из вещей, которые я хочу сделать, это создать новое окно запроса и программно подключить его к экземпляру сервера (в контексте входа в систему SQL).Я могу создать новое окно сценария запроса просто отлично, но я не могу найти, как подключить его, не подключившись сначала вручную к чему-то другому (например, к обозревателю объектов).
Другими словами, если я подключу Obect Explorer к экземпляру SQL вручную, а затем выполню метод моей надстройки, который создает окно запроса, я могу подключить его, используя этот код:
ServiceCache.ScriptFactory.CreateNewBlankScript(
Editors.ScriptType.Sql,
ServiceCache.ScriptFactory.CurrentlyActiveWndConnectionInfo.UIConnectionInfo,
null);
Но я не хочу полагаться на CurrentlyActiveWndConnectionInfo.UIConnectionInfo для подключения.Я хочу программно установить имя пользователя и пароль для входа в SQL.
У кого-нибудь есть какие-нибудь идеи?
Редактировать:
Мне удалось подключить окно запроса, установив последний параметр для экземпляра System.Data.SqlClient.SqlConnection.Однако соединение использует контекст последнего входа в систему, который был подключен, вместо того, что я пытаюсь установить программно.То есть пользователь, к которому он подключается, выбирается в диалоговом окне подключения, которое вы получаете, когда нажимаете кнопку Создать запрос и у вас не подключен обозреватель объектов.
РЕДАКТИРОВАТЬ 2:
Я пишу (или надеюсь написать) надстройку для автоматической отправки инструкции SQL и результатов выполнения в нашу систему отслеживания обращений при запуске на наших производственных серверах.Одна из моих мыслей заключалась в том, чтобы удалить разрешения на запись и назначить логины через эту надстройку, которая также заставит пользователя ввести оператор case # cancelling, если его там нет.Другая мысль, которая у меня только что возникла, - проверить имя сервера в 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
.
Дай мне знать, если это сработает.