Як визначити всі збережені процедури, що посилаються на певну таблицю


136

Я створив таблицю про середовище розробки для тестування, і є кілька sp, які оновлюють цю таблицю. Тепер мені доведеться скинути цю таблицю, а також визначити всі SP, які посилаються на цю таблицю. Я зіткнувся з труднощами, щоб знайти список усіх сп. Будь ласка, підкажіть деякий запит, вважаючи, що ім'я таблиці "x", а база даних - sql сервер 2005.




1
експертам: як щодо сервера, що не є MS SQL?
Деян

Відповіді:


259
SELECT Name
FROM sys.procedures
WHERE OBJECT_DEFINITION(OBJECT_ID) LIKE '%TableNameOrWhatever%'

BTW - ось зручний ресурс для такого типу запитань: Запит запитань щодо поширених запитань щодо системи SQL Server


3
Чи є якась причина для цього через доступ до ROUTINE_DEFINITIONввімкнення INFORMATION_SCHEMA.ROUTINES?
Марі

1
@Marie - у SQL-Server 2005 (AFAIK) цього немає.
Ланцюги

2
Запитання, чи знайде це рішення посилання на об'єкти, коли на них посилаються всередині рядка? як,set @Query = “SELECT * FROM Object_I_Need_To_Find_References…”;
Jeff.Clark

1
@ Jeff.Clark - Існує простий спосіб дізнатися :-) - але так, він шукає текст процедури безпосередньо, так що це знайде це.
Ланцюжки

2
так, так :) Це
знадобило б

27

Наступні роботи над SQL2008 і вище. Надає список як збережених процедур, так і функцій.

select distinct [Table Name] = o.Name, [Found In] = sp.Name, sp.type_desc
  from sys.objects o inner join sys.sql_expression_dependencies  sd on o.object_id = sd.referenced_id
                inner join sys.objects sp on sd.referencing_id = sp.object_id
                    and sp.type in ('P', 'FN')
  where o.name = 'YourTableName'
  order by sp.Name

1
ОП потребує відповіді для SQL-Server-2005
Chains

19

іноді вище запити не дадуть правильного результату, є вбудована збережена процедура, доступна для отримання табличних залежностей як:

EXEC sp_depends @objname = N'TableName';

1
Для мене це показало тригери та види, але не збережені документи.
NealWalters

1
ПРИМІТКА. Я запускав це в системі, де я мав доступ до таблиць, але не зберігаються програми, тому, звичайно, збережені програми не відображалися в результаті.
NealWalters

18

Незапитним способом було б використання студії управління сервером Sql.

Знайдіть таблицю, клацніть правою кнопкою миші та оберіть «Переглянути залежності».

EDIT

Але, як сказали коментатори, це не дуже надійно.


4
Інформація про залежності в 2005 році недостовірна, якщо об'єкти створені не в правильному порядку.
Мартін Сміт

3
Як зазначав @Martin Smith, збережена процедура, що посилається на неіснуючий об'єкт, буде створена, хоча і з попередженням, але запис не буде розміщений у sysdepends. Також те ж саме стосується і збережених процедур, що посилаються на таблицю в іноземній базі даних: жодна запис ніколи не розміщується в sysdepends в будь-якій базі даних. Особливістю Антогера є те, що скидання / відтворення таблиці або перегляду розриває ланцюг залежностей. Ці ... помилки ... функції роблять відстеження залежності SQL Server в значній мірі марним.
Ніколас Кері

7

Наступний запит отримає всі назви збережених процедур та відповідне визначення цих SP

select 
   so.name, 
   text 
from 
   sysobjects so, 
   syscomments sc 
where 
   so.id = sc.id 
   and UPPER(text) like '%<TABLE NAME>%'

5
SELECT
    o.name
FROM
    sys.sql_modules sm
INNER JOIN sys.objects o ON
    o.object_id = sm.object_id
WHERE
    sm.definition LIKE '%<table name>%'

Пам’ятайте, що це також з’явиться SP, де ім'я таблиці знаходиться в коментарях або де ім'я таблиці є підрядком іншого імені таблиці, яке використовується. Наприклад, якщо у вас є таблиці з назвою "test" і "test_2" і ви намагаєтеся шукати SP з "test", то ви отримаєте результати для обох.


2
Запит syscommentsтаким способом не є надійним для тривалих процедур, оскільки він розбиває визначення на 4000 фрагментів символів на кілька рядків. sys.sql_modulesцього уникає.
Мартін Сміт

1
Гарна думка. Я оновив його для використання sys.sql_modulesнатомість.
Том Н

3
syscomments був розвінчаний в кожному з моєї дюжини відповідей на те ж питання stackoverflow.com / ...
ГБН

5

Запит нижче працює лише під час пошуку залежностей від таблиці, а не тих, що знаходяться у стовпці:

EXEC sp_depends @objname = N'TableName';

Однак наступний запит є найкращим варіантом, якщо ви хочете шукати всілякі залежності, він не пропускає жодної речі. Це фактично дає більше інформації, ніж потрібно.

 select distinct
        so.name
        --, text 
  from 
       sysobjects so, 
       syscomments sc 
  where 
     so.id = sc.id 
     and lower(text) like '%organizationtypeid%'
  order by so.name

1
Для мене нічого не повернулося в SSMS 2014, що працює проти бази даних на SQL Server 12.0)
NealWalters

3
SELECT DISTINCT OBJECT_NAME(OBJECT_ID),
object_definition(OBJECT_ID)
FROM sys.Procedures
WHERE object_definition(OBJECT_ID) LIKE '%' + 'table_name' + '%'

GO

Це спрацює, якщо вам потрібно згадати назву таблиці.


3

У студії управління ви можете просто клацнути правою кнопкою миші на таблицю та натиснути "Переглянути залежності" введіть тут опис зображення

ніж ви можете побачити список об'єктів, які залежать від вашої таблиці:введіть тут опис зображення


1

У вас є 2 варіанти:

---- Варіант 1

SELECT DISTINCT so.name
FROM syscomments sc
INNER JOIN sysobjects so ON sc.id=so.id
WHERE sc.TEXT LIKE '%tablename%'

---- Варіант 2

SELECT DISTINCT o.name, o.xtype
FROM syscomments c
INNER JOIN sysobjects o ON c.id=o.id
WHERE c.TEXT LIKE '%tablename%'

Ці 2 запити отримають усі збережені процедури, які посилаються на потрібну вам таблицю. Цей запит спирається на 2 таблиці sys, які є сисобектами та систематизаторами. Sysobjects - це місце, де зберігаються всі ваші імена об’єктів БД, це включає збережені процедури.

Система містить текст для всіх ваших процедур.

Якщо ви запитуєте : SELECT * FROM системних коментарів

У вас буде таблиця, що містить ідентифікатор, який є відображенням до таблиці sysobjects з текстом, що міститься в збережених процедурах, як останній стовпець.


0

Спробуйте це

   SELECT DISTINCT so.name
    FROM syscomments sc
    INNER JOIN sysobjects so ON sc.id=so.id
    WHERE sc.TEXT LIKE '%your table name%'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.