查看SQL Server数据库对象列表时如何识别系统对象?

时间:2011-06-15 16:40:36

标签: sql-server sql-server-2008 database-schema

我正在尝试列出服务器上所有数据库中的所有存储过程,而我似乎无法可靠地过滤掉系统对象。我正在使用:

SELECT *
  FROM sysobjects
 WHERE id > 100

除了MSDB之外,每个数据库似乎都能正常工作,MSDB充满了大量具有正常ID的存储过程,但它们是系统存储的过程。据我所知,我无法使用sysobjects表中的任何值过滤掉系统存储的过程 - 是否有其他人知道可用于过滤的值?

它们都标记为type =“P”,这意味着它是一个存储过程,但似乎没有标志来指定它是系统存储过程还是用户存储过程。我可以使用sys.objects视图并过滤“IsMsShipped = 0”,但我想要的东西也适用于SQL 2000,所以如果可能的话,我更喜欢使用较旧的视图(如sysobjects)。 p>

3 个答案:

答案 0 :(得分:5)

这适用于我的SQL Server 2008 R2安装。除了用户数据库之外,我什么都看不到

SELECT 
    *
FROM
   sys.objects
WHERE
   OBJECTPROPERTY(object_id, 'IsMSShipped') = 0

您可以将sys.objects更改为sys.tables,它仍然有效,或使用“type”列进行过滤。或者使用OBJECTPROPERTY(object_id,'IsProcedure')等。

注意:它是SQL Server 2005 +中的sys.objects

注意2:OBJECTPROPERTY也适用于SQL Server 2000:

SELECT 
    *
FROM
   sysobjects
WHERE
   OBJECTPROPERTY(id, 'IsMSShipped') = 0

答案 1 :(得分:2)

SQL Server 2005及更高版本

SELECT
  SCHEMA_NAME(obj.schema_id) AS schema_name,
  obj.name AS proc_name
FROM
  sys.procedures obj WITH(NOLOCK)
ORDER BY
  schema_name,
  proc_name

SQL Server 2000

SELECT
  USER_NAME(obj.uid) AS user_name,
  obj.name AS proc_name,
FROM
  sysobjects obj WITH(NOLOCK)
WHERE
  (obj.status & 0x80000000) = 0
  AND RTRIM(obj.xtype) IN ('P', 'RF')
ORDER BY
  user_name,
  proc_name

答案 2 :(得分:1)

在某些 SQL 版本中(我不知道这是从哪个版本开始的),至少在一种情况下,数据库可以包含具有设置为 false 的 IsMSShipped 属性的系统对象.

由于能够将数据库图表添加到数据库,因此通常会在初始安装后添加以下对象,例如在 SSMS 中,当用户发起创建数据库图表的请求时。

enter image description here

我将之前接受的答案修改如下:

SELECT 
    *
FROM
   sysobjects obj
WHERE
   OBJECTPROPERTY(obj.id, 'IsMSShipped') = 0
AND (CAST(
    CASE
        WHEN (
            SELECT 
                major_id 
            FROM 
                sys.extended_properties 
            WHERE 
                major_id = obj.id and 
                minor_id = 0 and 
                class = 1 and 
                name = N'microsoft_database_tools_support') 
            IS NOT NULL then 1
        ELSE 0
    END as bit)) = 0

这个额外的子查询取自 SSMS 在获取(非)系统对象列表时执行的代码。