Pregunta

Estoy intentando crear un complemento SSMS. Una de las cosas que quiero hacer es crear una nueva ventana de consulta y conectarla programáticamente a una instancia del servidor (en el contexto de un inicio de sesión SQL). Puedo crear la nueva ventana de script de consulta muy bien, pero no puedo encontrar cómo conectarla sin conectarme primero manualmente a otra cosa (como el Explorador de objetos).

Entonces, en otras palabras, si conecto Obect Explorer a una instancia de SQL manualmente y luego ejecuto el método de mi complemento que crea la ventana de consulta, puedo conectarlo usando este código:

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

Pero no quiero confiar en CurrentlyActiveWndConnectionInfo.UIConnectionInfo para la conexión. Quiero establecer un nombre de usuario y contraseña de inicio de sesión SQL mediante programación.

¿Alguien tiene alguna idea?

EDIT:

He logrado conectar la ventana de consulta estableciendo el último parámetro en una instancia de System.Data.SqlClient.SqlConnection. Sin embargo, la conexión utiliza el contexto del último inicio de sesión que se conectó en lugar de lo que estoy tratando de configurar programáticamente. Es decir, el usuario al que se conecta es el seleccionado en el Diálogo de conexión que obtiene cuando hace clic en el botón Nueva consulta y no tiene un Explorador de objetos conectado.

EDIT2:

Estoy escribiendo (o espero escribir) un complemento para enviar automáticamente una declaración SQL y los resultados de ejecución a nuestro sistema de seguimiento de casos cuando se ejecuta en nuestros servidores de producción. Pensé que tenía que eliminar los permisos de escritura y asignar inicios de sesión a través de este complemento que también obligará al usuario a ingresar un número de caso que cancele la declaración si no está allí. Otro pensamiento que acabo de tener es inspeccionar el nombre del servidor en ServiceCache.ScriptFactory.CurrentlyActiveWndConnectionInfo.UIConnectionInfo y compararlo con nuestra lista de servidores de producción. Si coincide y no hay ningún número de caso, cancele la consulta.

¿Fue útil?

Solución

No he encontrado una manera de hacerlo, ya que parece que no hay forma de engancharlo en la ventana del diálogo de conexión.

¿en qué estás trabajando?

EDITAR: Si entiendo correctamente, ¿desea interceptar la consulta que se está ejecutando y si coincide con el servidor de producción, cancelarla? ¿Enviar el texto y los resultados a un DB? hmm ... si bien esto sería posible, pero es un verdadero dolor de fondo, y no usaría un complemento para esto. Además, un complemento se puede deshabilitar, desinstalar, etc. mejor intente hacerlo con la configuración de seguridad adecuada en su servidor de producción.

Otros consejos

En caso de que alguien más esté buscando una manera de crear y conectar una ventana de consulta programáticamente, un breve ejemplo 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 fragmento de código abrirá una nueva ventana de consulta conectada al servidor y la base de datos especificados con autenticación de Windows.

Todavía no lo he probado, pero no sabía si le habías dado una oportunidad.

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

Debería permitirle hacer su propia conexión. Pero como dije, aún no lo he probado. Necesitará una referencia a Microsoft.SqlServer.RegSvrEnum.dll .

Avísame si funciona.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top