【问题标题】:SQL localdb instance not accessible after creation during install在安装期间创建后无法访问 SQL localdb 实例
【发布时间】:2019-08-12 16:48:10
【问题描述】:

我有一个 Windows 服务,它在安装期间创建一个命名的 sql localdb 实例。我在安装过程中以本地系统帐户执行命令,可以创建、信息查询和启动实例。 我正在使用作为本地系统帐户运行的 wix 自定义操作来创建它,它可以顺利启动:

<!-- Custom action for creating a named localdb instance -->
<CustomAction Id="CA_SetPropertiesCreateLocalDbInstance" Property="CA_CreateLocalDbInstance" Value="InstanceName=MyLocalDbInstance" />
<CustomAction Id="CA_CreateLocalDbInstance" BinaryKey="BIN_CustomActions" DllEntry="CreateLocalDbInstance" Execute="deferred" Impersonate="no" Return="check" HideTarget="no" />

<!-- Schedule the Custom Actions -->
<InstallExecuteSequence>
    <Custom Action="CA_SetPropertiesCreateLocalDbInstance" Before="CA_CreateLocalDbInstance">NOT Installed</Custom>
    <Custom Action="CA_CreateLocalDbInstance" Before="InstallFinalize">NOT Installed</Custom>
</InstallExecuteSequence>

安装期间运行的自定义操作的日志:

Executing command 'sqllocaldb c MyLocalDbInstance'
command output>>    LocalDB instance "MyLocalDbInstance" created with version 14.0.3162.1.
command exit code>> 0
Executing command 'sqllocaldb s MyLocalDbInstance'
command output>>    LocalDB instance "MyLocalDbInstance" started.
command exit code>> 0
Executing command 'sqllocaldb i MyLocalDbInstance'
command output>>    Name:               MyLocalDbInstance
command output>>    Version:            14.0.3162.1
command output>>    Shared name:        
command output>>    Owner:              NT AUTHORITY\SYSTEM
command output>>    Auto-create:        No
command output>>    State:              Running
command output>>    Last start time:    8/8/2019 11:40:23 PM
command output>>    Instance pipe name: np:\\.\pipe\LOCALDB#3FB77699\tsql\query
command exit code>> 0

但是,当我在应用程序运行时尝试访问 localdb 实例时,我收到错误 error: 50 - Local Database Runtime error occurred. The specified LocalDB instance does not exist.

如果我使用 psexec.exe (MSFT tool for powershell) 以 localsystem 帐户运行 sqllocaldb 查询,我可以看到我创建的 localdb 实例:

PS C:\WINDOWS\system32> whoami
nt authority\system
PS C:\WINDOWS\system32> sqllocaldb i
MSSQLLocalDB
MyLocalDbInstance

我可以访问默认实例的信息没问题,但尝试查询创建的实例会导致错误:

PS C:\WINDOWS\system32> sqllocaldb i MyLocalDbInstance
Printing of LocalDB instance "MyLocalDbInstance" information failed because of the following error:
LocalDB instance "MyLocalDbInstance" doesn't exist!

有趣的是,如果我再次从 localsystem powershell 实例运行“sqllocaldb c MyLocalDbInstance”,它会创建一个新实例。 “sqllocaldb c MyLocalDbInstance”命令的后续执行只会覆盖新创建的:

PS C:\WINDOWS\system32> sqllocaldb c MyLocalDbInstance
LocalDB instance "MyLocalDbInstance" created with version 14.0.3162.1.
PS C:\WINDOWS\system32> sqllocaldb c MyLocalDbInstance
LocalDB instance "MyLocalDbInstance" created with version 14.0.3162.1.
PS C:\WINDOWS\system32> sqllocaldb i
MSSQLLocalDB
MyLocalDbInstance
MyLocalDbInstance

我很困惑,并且可能缺少以下知识之一来追踪问题:

-奇怪的 windows-user 划分阻止访问的东西

-sqllocaldb 的内部复杂性

-与 psexec.exe 的人工交互掩盖了真正的问题

我的下一个调试步骤可能是在 安装,但出于安全原因,这是不可取的。

如果有人真的想深入研究,我可以尝试使用虚拟安装程序建立一个虚拟项目。

【问题讨论】:

  • 不幸的是,我认为这是为了创建 sql 数据库,我需要实际创建一个 localdb 实例,然后将数据库添加到该实例。我试图在安装期间与本机 localdb api 交互,而不求助于第三方解决方案,试图弄清楚为什么我的基本级别“只使用 cli”没有按预期工作

标签: wix windows-installer localdb


【解决方案1】:

我只在安装程序中使用过一次 localdb。这是一个独立的“演示”版本的应用程序,他们不想安装 IIS 和完整的 SQL 实例。基本上是在一个人使用的笔记本电脑上。

我创建和启动数据库的自定义操作设置为 Impersonate="yes",这样命令将在用户执行安装时运行,并且在这种情况下,当用户尝试启动应用。我不认为我们使用这个数据库测试了多个用户,但我很确定数据库必须“共享”才能这样做,这意味着我的命令需要在没有模拟的情况下运行,因此它使用 SYSTEM/Admin privs 运行。

https://docs.microsoft.com/en-us/sql/tools/sqllocaldb-utility?view=sql-server-2017

请参阅:使用 LocalDB 的共享实例

阅读有关共享命令的文档,您似乎必须明确地将其共享给您想要访问的每个人。这向我表明,创建一个作为服务帐户运行的 API 层并仅将其共享给该帐户可能是最灵活的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-27
    • 2014-03-24
    • 1970-01-01
    • 2015-06-03
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    相关资源
    最近更新 更多