无法连接到 (localdb)\MSSQLLocalDB - 由于触发器执行

10

我在我的计算机上安装了SQL Server Express实例,之前一直运行良好,但现在出现以下错误:

由于触发器执行而导致登录'myusername'失败。
已更改数据库上下文为“master”。

我尝试遵循这个链接:https://dba.stackexchange.com/questions/218811/logon-failed-for-login-due-to-trigger-execution

有很多关于删除引起问题的触发器的建议,如果需要可以通过专用管理员连接(DAC)连接来执行此操作。因为我可以使用 MACHINENAME\INSTANCENAME 成功地连接到 sa,所以我不必通过 DAC 连接。我的问题只在使用 (localdb)\MSSQLLocalDB 连接时出现。由于某种原因,仅在 LocalDB 中会出现此错误。

当我使用 'sa' 登录并运行以下内容时:

SELECT * FROM sys.server_triggers;

没有返回数据行,结果为空。那么,我需要禁用哪个触发器呢?LocalDB没有连接到我的SQL Server Express的实例吗?还是说,LocalDB连接到其他有触发器问题的东西,而通过连接则没有触发器?如果存在触发器,我认为“sa”登录应该能够看到它们。
编辑1: 好的。现在我已经在msdb数据库中找到了所有这些触发器。我已经检查了所有的数据库,只有这个数据库有任何触发器。
syscollector_collection_item_parameter_update_trigger syscollector_tsql_query_collector_delete_trigger trig_targetserver_insert
syspolicy_update_system_health_state sysmanagement_delete_shared_server_group_trigger syspolicy_execution_trigger trig_notification_ins_or_upd
trig_notification_delete syspolicy_validate_events
syspolicy_insert_job_create_trigger syspolicy_update_job_update_trigger syspolicy_insert_policy_trigger syspolicy_update_policy_trigger syspolicy_delete_job_delete_trigger syspolicy_instead_delete_policy_trigger syspolicy_insert_condition_trigger syspolicy_for_update_condition_trigger trig_sysoriginatingservers_delete syspolicy_after_update_condition_trigger trig_sysjobs_insert_update syscollector_collection_set_is_running_update_trigger trig_sysmail_profile trig_sysschedules_insert_update trig_principalprofile trig_sysmail_account
trig_sysmail_profileaccount
trig_backupset_delete trig_sysmail_profile_delete trig_sysmail_servertype trig_sysmail_server trig_sysmail_configuration
trig_sysmail_mailitems
syspolicy_insert_target_set_level_trigger trig_sysmail_attachments
syspolicy_update_target_set_level_trigger trig_sysmail_log
syspolicy_insert_target_set_trigger syspolicy_delete_target_set_trigger

这可能是一个数据库级别的触发器 select * from sys.triggers where parent_class = 0 - Charlieface
@Charlieface - 感谢您的帮助。我现在发现我有其他问题。在SQL Server配置管理器中,我似乎甚至没有列出MSSQLLocalDB实例。我不知道这个东西怎么了。我只是在一分钟内运行选择查询,然后下一个问题就出现了。 - gecclesinc
@Charlieface - 我也尝试了在附加参数中使用 Database=master - gecclesinc
@Charlieface - 好的,我可以通过更改到本地实例来再次在本地运行我的应用程序。虽然这不是理想情况,因为这是一个共享项目,但当我们需要针对本地数据库进行调试时,我们将通过切换连接字符串来解决问题。再次感谢您的所有帮助。 - gecclesinc
卸载并重新安装LocalDB。这将为您提供一个新的主数据库。 - Charlieface
显示剩余13条评论
2个回答

40

我的解决方案,从管理员Visual Studio CMD提示符中:

SqlLocalDB stop MSSQLLocalDB -k
SqlLocalDB delete MSSQLLocalDB
SqlLocalDB create MSSQLLocalDB -s

提醒:在此之前,我使用SQL Express安装程序升级到了2019版本。

最后附上我的注册表供您参考:

enter image description here


4
您关于以下内容的帖子SqlLocalDB stop MSSQLLocalDB -k SqlLocalDB delete MSSQLLocalDB SqlLocalDB create MSSQLLocalDB -s是解决方案。非常感谢您。 - Ola_leke
1
感谢您发布解决方案! - Johan B
那只是解决了症状 - 我现在已经第三次遇到这个问题了,仍然想知道最初可能导致损坏状态的原因。 - mbx
第四次了,还是不知道是什么触发了这个问题。 - mbx
@mbx 你最后找到原因了吗? - undefined
显示剩余2条评论

3

当这种情况发生在我们的机器上时,通常是由于在删除触发器之前删除了 Visual Studio VsCodeIndex 数据库。

由于 DAC 不起作用,我们使用此方法重新访问我们的实例而不会丢失任何数据:

  1. 关闭所有 Visual Studio/Code 实例以防止数据库竞争条件
  2. 找到安装目录,应该类似于 C:\Users\USER\AppData\Local\Microsoft\Microsoft SQL Server Local DB\Instances\MSSQLLocalDB
  3. 打开最近的日志文件并验证 SQL Server 确实正在尝试打开一个不存在的数据库。日志文件末尾应该像这样
2023-05-22 16:03:52.89 spid51      Error: 17204, Severity: 16, State: 1.
2023-05-22 16:03:52.89 spid51      FCB::Open failed: Could not open file C:\Users\USER1\AppData\Local\Temp\VS11CodeIndex\Microsoft.VsCodeIndex_2f1ff123_0949_4b08_88ae_5cda46820c33.mdf for file number 0.  OS error: 3(Het systeem kan het opgegeven pad niet vinden.).
2023-05-22 16:03:52.89 spid51      Error: 5120, Severity: 16, State: 101.
  1. 如果日志文件不同,该过程将无法工作
  2. 创建有问题的路径(例如,在上面的示例中为C:\Users\USER1\AppData\Local\Temp\VS11CodeIndex
  3. 在此文件夹中复制现有数据库(空数据库就足够了,我们通常有几个),并正确命名。在上面的示例中,MDFMicrosoft.VsCodeIndex_2f1ff123_0949_4b08_88ae_5cda46820c33.mdf,而LDFMicrosoft.VsCodeIndex_2f1ff123_0949_4b08_88ae_5cda46820c33_log.ldf(请注意,文件名以_log结尾)
  4. 现在您应该能够使用SSMS登录
  5. 导航到Server Objects\Triggers
  6. 删除有问题的触发器。截至今天,我们有这两个
  • Trigger_Repository_Microsoft.VsCodeIndex_Drop
  • Trigger_Repository_Microsoft.VsCodeIndex_Repository.Item_Logon_SetSecurityClaims
  1. 删除虚假数据库

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接