如何解决"procedure has an unresolved reference to object dbo.sysssislog"的问题

4
我有一个Visual Studio 2010数据库项目,并导入了一个现有的模式。该数据库中有存储过程引用Integration Services系统表dbo.sysssislog,并在我的项目中生成了许多警告。
我尝试添加master.dbschema和msdb.dbschema作为数据库引用,还尝试将引用的数据库名称重命名为tempdb(而不是master或msdb),但问题仍然存在。
我打开了msdb.dbschema文件,并确认sysssislog表存在于该文件中。
以下是警告内容:
SQL04151: Procedure: [dbo].[storedProcedureName] has an unresolved reference to object [dbo].[sysssislog].
2个回答

4
dbo.sysssislog 是由 SQL Server Integration Services (SSIS) 自动创建的用户表(标记为系统表),用于创建具有 SQL Server 事件日志记录的包时。除了这个表,SSIS 还创建了一些存储过程(可以通过 ALTER 进行更改),以帮助记录过程。
在您的项目中,它是一个未解决的引用,可能是因为您导入了数据库架构,结果导入了所提到的存储过程,但没有导入 dbo.sysssislog 表,因为它被标记为系统表。
所以现在,你有一堆引用你还没有导入的表的存储过程,从而导致该警告。
为了摆脱这些警告,您可以手动 DROP 并重新 CREATE 表(这是唯一消除系统表标记的方法),并将其导入到您的项目中。

将其创建为用户表不会使其行为有任何不同,对吧?我只是想确保解决方案在未来能够正常工作,并且我不必将其作为系统表维护在服务器上,而是作为用户表存储在源代码控制中。 - Nick H
不会的。我通常会更改表格以添加自定义日志记录的新列,并且这样做没有遇到任何问题。 - gonsalu
很好,谢谢,特别是关于删除/重新创建的提示非常有帮助。 - cdonner

3

这里有一种替代方式,更加简洁:

创建一个新的空SSDT项目,将其命名为“sysssislog”,并添加一个sysssislog表的脚本。构建该项目以生成dacpac文件“sysssislog.dacpac”。

在SSDT项目中添加一个数据库引用到dacpac文件,并在“添加数据库引用”对话框中选择“相同的数据库”作为数据库位置。

如果您的项目受源代码控制,则可以将dacpac添加到项目中,然后再添加引用,使得dacpac文件也在源代码控制下。


我做了这件事,一开始似乎运行良好,但非常奇怪的是发布尝试创建表格(因此脚本执行失败)。 我相信这个功能(使用同一个数据库)允许您锁定数据库的某些部分,或在数据库之间包含共享源代码\表格(例如审核或日志记录)。 - Trubs
跟进Trubs的评论,shapkin的方法确实可以消除警告,但无法进行发布,因为发布工具无法检测到被标记为系统属性(可能是is_ms_shipped)的表。我特别发现解决警告的唯一方法是将71502添加到产生警告的特定文件的“Suppress TSql Warnings”属性中。 - efesar
继续跟进Trubs的评论,shapkin的方法可以消除警告,但无法进行发布,因为发布工具无法检测到被标记为系统属性(可能是is_ms_shipped)的表。我特别发现解决警告的唯一方法是将71502添加到产生警告的特定文件的“Suppress TSql Warnings”属性中。 - efesar

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