在MS SQL 2012上从Windows Installer运行SQL脚本

时间:2013-08-22 11:17:46

标签: c# windows-installer sql-server-2012

我已经为我的软件创建了一个Windows Installer - 它可以在所有Windows版本中与MS SQL 2008服务器结合使用。但是,随着MS SQL 2012的引入,Windows Installer正在使用的帐户(SYSTEM_LOCAL)默认情况下已取消其“sysadmin”权限,从而使我无法直接从安装程序运行SQL脚本 - 客户在运行安装程序之前添加“sysadmin”角色。

SQL脚本包含用于构建应用程序数据库,设置CLR功能等的SQL命令。

在代码背后,我使用以下标准方法从C#执行SQL:

/// <summary>
/// Execute the sql script from file
/// </summary>
/// <param name="serverName"></param>
/// <param name="user"></param>
/// <param name="password"></param>
/// <param name="dbName"></param>
/// <param name="Sql"></param>
private void ExecuteSql(string serverName, string user, string password, string dbName, string Sql)   
{   
    string connStr;
    string userName = user.Trim();

    // Check if Integrated security is used
    if (userName == "")
    {
        // Use integrated security
        connStr = "Data Source=" + serverName + ";Initial Catalog=" + dbName + ";Integrated Security=True";
    }
    else
    {
        // Use username and password
        connStr = "Data Source=" + serverName + ";Initial Catalog=" + dbName + ";Integrated Security=False;User Id=" + user + ";Password=" + password;
    }

    using (SqlConnection conn = new SqlConnection(connStr))   
    {   
        try  
        {
            Microsoft.SqlServer.Management.Smo.Server server = new Microsoft.SqlServer.Management.Smo.Server(new ServerConnection(conn));   
            server.ConnectionContext.ExecuteNonQuery(Sql);
            Log("Succeeded");
        }   
        catch (Exception ex)   
        {   
            Log(ex.ToString());   
        }   
    }   
}

我想知道是否有其他方法可以从安装程序运行我的SQL代码,使用MS SQL 2012中具有足够权限运行SQL命令的帐户。我看过一些似乎是从命令窗口执行SQL的安装程序 - 很可能是使用允许在SQL服务器上运行SQL命令的帐户运行这些命令窗口,但是我找不到他们是怎么做的。

任何提示或帮助都会受到极大的赞赏。

我很抱歉英语不好。

1 个答案:

答案 0 :(得分:1)

我会考虑使用Windows Installer XML(WiX)或InstallShield来编写您的MSI。两者都具有Windows Installer的模式/扩展,以便于在不必重新发明轮子的情况下针对连接执行SQL脚本。

SqlDatabase Element (Sql Extension)

SQL Scripts View

速度最快的书面和最高质量的安装程序是那些专注于需要完成而不是如何操作的安装程序。框架应提供繁重的工作,以提高可靠性和普通用户体验。