Как идентифицировать системные объекты при просмотре списка объектов базы данных SQL Server? - PullRequest
2 голосов
/ 15 июня 2011

Я пытаюсь перечислить все хранимые процедуры из всех баз данных на моем сервере, и я не могу надежно отфильтровать системные объекты.Я использовал:

SELECT *
  FROM sysobjects
 WHERE id > 100

, который, кажется, прекрасно работает во всех базах данных, кроме MSDB, который полон тонны хранимых проков с нормально выглядящими идентификаторами, но это системные хранимые проки.Насколько я могу судить, я не могу отфильтровать системные хранимые процессы, используя любое из значений в таблице sysobjects - кто-нибудь еще знает о значении, которое можно использовать для фильтрации?

Они 'все они помечены как type = "P", что означает, что это хранимый процесс, но, похоже, нет флага, который бы указывал, является ли он системным или пользовательским.Я могу использовать представление и фильтр sys.objects для «IsMsShipped = 0», но мне бы хотелось что-то, что также работает в SQL 2000, поэтому я бы предпочел использовать более старые представления (например, sysobjects), если это возможно.

Ответы [ 2 ]

5 голосов
/ 15 июня 2011

Это работает на моей установке SQL Server 2008 R2.Я ничего не вижу, за исключением пользовательских баз данных

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

Вы можете изменить sys.objects , чтобы сказать, sys.tables и он все еще работает, или использовать "тип"столбец для фильтрации.Или используйте OBJECTPROPERTY (object_id, 'IsProcedure') и т. Д.

Примечание: это sys.objects в SQL Server 2005 +

Примечание 2: OBJECTPROPERTY будет работать для SQL Server2000 тоже:

SELECT 
    *
FROM
   sysobjects
WHERE
   OBJECTPROPERTY(id, 'IsMSShipped') = 0
2 голосов
/ 15 июня 2011

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
...