我正在尝试创建一个SSMS加载项。我想要做的一件事是创建一个新的查询窗口并以编程方式将其连接到服务器实例(在SQL登录的上下文中)。我可以很好地创建新的查询脚本窗口,但是如果没有先手动连接到其他东西(比如对象资源管理器),我就找不到如何连接它。

换句话说,如果我手动将Obect Explorer连接到SQL实例,然后执行创建查询窗口的加载项的方法,我可以使用以下代码连接它:

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

但我不想依赖CurrentlyActiveWndConnectionInfo.UIConnectionInfo进行连接。我想以编程方式设置SQL登录用户名和密码。

有没有人有任何想法?

修改

我设法通过将最后一个参数设置为System.Data.SqlClient.SqlConnection的实例来连接查询窗口。但是,连接使用已连接的上次登录的上下文而不是我尝试以编程方式设置的上下文。也就是说,它连接的用户就是在单击“新建查询”按钮并且没有连接对象资源管理器时获得的连接对话框中选择的用户。

<强> EDIT2:

我正在编写(或希望编写)一个加载项,以便在针对我们的生产服务器运行时自动将SQL语句和执行结果发送到我们的案例跟踪系统。我有一个想法是删除写入权限并通过此加载项分配登录,这也将强制用户输入案例#取消语句,如果它不存在。我刚才想到的另一个想法是检查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 auth。

连接到指定的服务器和数据库

我还没试过这个,但不知道你是不是已经试过了。

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

应该允许您建立自己的连接。但就像我说的那样,我还没有测试过它。 您需要引用 Microsoft.SqlServer.RegSvrEnum.dll

让我知道它是否有效。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top