【问题标题】:SQL Server 2008 Orphaned Stored Procedure?SQL Server 2008 孤立存储过程?
【发布时间】:2013-10-30 21:20:39
【问题描述】:

我通过 SQL Server Management Studio 使用 SQL Server 2008

我以前从未见过这个:

通常,在重构数据库时,正如我大部分时间都在做的那样,我使用以下内容来查找对现有过程中列、表和其他过程的引用:

select *
from sys.sql_modules
where [definition] like '%SomethingImLookingFor%'

这没什么特别的,我相信很多数据库负责人以前都做过。

但是,我注意到结果包含一个在创建时看起来完全是意外的过程(如果实际创建的话)。在数据库中,我有一个名为ChatObject_Remove 的过程,它出现在我的查询中,因为我正在寻找任何引用术语%Remove% 的东西。但我也看到了一个名为 zzChatObject_Remove

ghost 过程

在 SSMS 中,当我展开数据库的 Programmability -> Stored Procedures 时,我看到 ChatObject_Remove,但没有看到 zzChatObject_Remove

我试过刷新这个组,鬼还是没有出现。

我尝试使用语句

drop procedure [dbo].[zzChatObject_Remove]

它返回一个错误,说它不存在或者我没有权限。

我尝试创建一个名为zzChatObject_Remove 的过程,它允许我这样做(但现在我在sql_modules 中有2 个对象,定义为create procedure zzChatObject_Remove ...)。然后我删除了它允许的新的,和预期的一样,幽灵仍然在模块表中,我无法触摸它。

有人见过吗?这还能在哪里?会不会有什么害处?如何摆脱sys.sql_modules 表中这个看似孤立的过程?

提前感谢您的任何意见。

只是我的运气,在万圣节期间看到了一个鬼魂......

【问题讨论】:

  • 您是否检查过它是否在另一个 Schema 中?
  • 在数据库上下文中执行这个语句,看看它是否给你一些信息,让你知道它是从哪里创建的 Select * from sys.procedures where [type] = 'P'
  • 存储过程的名称中是否有尾随空格或 Unicode 字符?

标签: sql sql-server stored-procedures database-administration orphan


【解决方案1】:

试试这个看看它出现在哪里:

exec sp_MSforeachdb '
    select ''?'' [db]
    , s.name [schema]
    , o.name [object]
    , o.type_desc 
    from [?].sys.objects o 
    inner join sys.schemas s 
        on s.schema_id = o.schema_id 
    where o.name = ''zzChatObject_Remove''
'

或以下:

select *
from sys.sql_modules sm
inner join sys.objects o 
    on o.object_id = sm.object_id
inner join sys.schemas s 
    on s.schema_id = o.schema_id 
where sm.description like '%zzChatObject_Remove%'

另外,要检查一下,这个过程是在 sql_modules 中定义的,还是因为它在另一个过程的代码中被引用而显示?

【讨论】:

    猜你喜欢
    • 2015-01-26
    • 2012-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多