Pergunta

Eu estou tentando criar um SSMS add-in. Uma das coisas que eu quero fazer é criar uma nova janela de consulta e programaticamente conectá-lo a uma instância do servidor (no contexto de um login SQL). Eu posso criar a nova janela script de consulta muito bem, mas não consigo encontrar como conectá-lo sem ligar primeiro manualmente para outra coisa (como o Object Explorer).

Assim, em outras palavras, se eu ligar obect Explorer para uma instância do SQL manualmente e, em seguida, executar o método do meu suplemento que cria a janela de consulta que pode conectá-lo usando este código:

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

Mas eu não quero depender de CurrentlyActiveWndConnectionInfo.UIConnectionInfo para a conexão. Eu quero definir um nome de usuário e senha SQL Acesso de programação.

Alguém tem alguma idéia?

EDIT:

Eu consegui obter a janela de consulta ligado, definindo o último parâmetro para uma instância de System.Data.SqlClient.SqlConnection. No entanto, a conexão usa o contexto do último login que foi conectado ao invés do que eu estou tentando definir programaticamente. Ou seja, o usuário se conecta, como é o selecionado no diálogo de conexão que você começa quando você clica no botão Nova consulta e não tem um Object Explorer conectado.

EDIT2:

Eu estou escrevendo (ou esperando para escrever) um add-in para enviar automaticamente uma instrução SQL e os resultados da execução para o nosso sistema de casos de rastreamento quando executado contra os nossos servidores de produção. Um pensamento que tive foi para remover permissões de gravação e logins atribuir através deste add-in que também irá forçar o usuário insira um caso de cancelar a declaração, se ele não está lá #. Um outro pensamento que eu tive apenas é inspecionar o nome do servidor em ServiceCache.ScriptFactory.CurrentlyActiveWndConnectionInfo.UIConnectionInfo e compará-lo à nossa lista de servidores de produção. Se ele corresponder e não há nenhum caso #, em seguida, cancelar a consulta.

Foi útil?

Solução

Eu não encontrei uma maneira de fazer isso, já que parece haver nenhuma maneira de ligar para a janela de diálogo de conexão.

o que você está trabalhando?

EDIT: Se bem entendi você quer interceptar a consulta que está sendo executado e se ele corresponde ao servidor de produção cancelá-lo o mais enviar o texto e os resultados a um db? hmm ... enquanto isso seria possível, mas é uma verdadeira dor importante no trás, e eu não iria usar um add-in para isso. além de um add-in pode ser desativado, desinstalado etc. é melhor você tentar fazer isso com configuração de segurança adequada no servidor de produção.

Outras dicas

Apenas no caso de qualquer outra pessoa está à procura de uma maneira de criar e ligar uma janela de consulta programmaticaly - um pequeno exemplo para 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);
} 

Este trecho de código irá abrir uma nova janela de consulta ligado ao servidor especificado e banco de dados com o Windows auth.

Eu não tentei isso ainda, mas não sabia se você deu-lhe um tiro.

Microsoft.SqlServer.Management.Smo.RegSvrEnum.UIConnectionInfo u = 
    new Microsoft.SqlServer.Management.Smo.RegSvrEnum.UIConnectionInfo();

Deve permitir que você faça a sua própria conexão. Mas como eu disse, eu não testei ainda. Você vai precisar de uma referência a Microsoft.SqlServer.RegSvrEnum.dll.

Deixe-me saber se funciona.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top