Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Системные таблиц. Узнать какие процедуры используют таблицу  [new]
dennny
Member

Откуда:
Сообщений: 590
Решил снести таблицу - удалить.
Мне хочется проверить какие хранимые процедуры её используют.
Наверняка системные таблицы такое где-то хранят - такие References ...
17 ноя 09, 19:25    [7941900]     Ответить | Цитировать Сообщить модератору
 Re: Системные таблиц. Узнать какие процедуры используют таблицу  [new]
iljy
Member

Откуда:
Сообщений: 8711
dennny,

sys.sql_dependencies
17 ноя 09, 19:36    [7941933]     Ответить | Цитировать Сообщить модератору
 Re: Системные таблиц. Узнать какие процедуры используют таблицу  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Автор, посмотрите, пожалуйста, следующий простенький пример:
create table tbl223322(id int)
insert into tbl223322 values(101)
go
create procedure proc1 as
begin
   declare @n int, @sql varchar(100)
   set @n = 223322
   set @sql = 'select * from tbl' + cast(@n as varchar(10))
   exec(@sql)
end
go
exec proc1
go
drop procedure proc1
drop table tbl223322
go
Хоть таблица в процедуре и используется
(результат запуска примера как бы говорит сам за себя:)
но вряд ли "системные таблицы такое где-то хранят - такие References"

Если у Вас в БД такой же нехороший код встречается, помогут Вам имхо лишь Ваши глаза...
17 ноя 09, 19:45    [7941942]     Ответить | Цитировать Сообщить модератору
 Re: Системные таблиц. Узнать какие процедуры используют таблицу  [new]
dennny
Member

Откуда:
Сообщений: 590
Мда. Придется перелопачивать код все же похоже ...
EXEC ранее кое-где использовал.
17 ноя 09, 20:09    [7942012]     Ответить | Цитировать Сообщить модератору
 Re: Системные таблиц. Узнать какие процедуры используют таблицу  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
dennny,

код по любому придётся перелопачивать.

create procedure _TEST_
as 
 select * from _TESTTABLE
go

select * from sys.sql_dependencies where object_id = object_id('_TEST_')
go
create table _TESTTABLE(id int)
go
exec _TEST_
go
alter procedure _TEST_
as select * from _TESTTABLE_
go
select * from sys.sql_dependencies where object_id = object_id('_TEST_')
go
drop procedure _TEST_
go
create procedure _TEST_
as 
 select * from _TESTTABLE
go
select * from sys.sql_dependencies where object_id = object_id('_TEST_')
go
17 ноя 09, 20:15    [7942026]     Ответить | Цитировать Сообщить модератору
 Re: Системные таблиц. Узнать какие процедуры используют таблицу  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
для 2008 можно и нужно использовать sys.sql_expression_dependencies.
но в случае с dsql это всё равно не спасает.

-------------------------
There’s no silver bullet!
17 ноя 09, 20:16    [7942031]     Ответить | Цитировать Сообщить модератору
 Re: Системные таблиц. Узнать какие процедуры используют таблицу  [new]
dennny
Member

Откуда:
Сообщений: 590
locky
dennny,

код по любому придётся перелопачивать.

create procedure _TEST_
as 
 select * from _TESTTABLE
go

select * from sys.sql_dependencies where object_id = object_id('_TEST_')
go
create table _TESTTABLE(id int)
go
exec _TEST_
go
alter procedure _TEST_
as select * from _TESTTABLE_
go
select * from sys.sql_dependencies where object_id = object_id('_TEST_')
go
drop procedure _TEST_
go
create procedure _TEST_
as 
 select * from _TESTTABLE
go
select * from sys.sql_dependencies where object_id = object_id('_TEST_')
go


Что-то не совсем понял все Ваши эманации - можно вкратце пояснить зачем там разные таблицы используются в запросах к sys.sql_dependencies и зачем процедура на ходу правится ?
17 ноя 09, 20:58    [7942120]     Ответить | Цитировать Сообщить модератору
 Re: Системные таблиц. Узнать какие процедуры используют таблицу  [new]
iljy
Member

Откуда:
Сообщений: 8711
dennny,

а вы его выполните и посмотрите на результат
17 ноя 09, 21:00    [7942122]     Ответить | Цитировать Сообщить модератору
 Re: Системные таблиц. Узнать какие процедуры используют таблицу  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
dennny
Что-то не совсем понял все Ваши эманации - можно вкратце пояснить зачем там разные таблицы используются в запросах к sys.sql_dependencies и зачем процедура на ходу правится ?

Это к вопросу о доверии к sys.sql_dependencies.
sys.sql_dependencies далеко не всегда отображает правдивую информацию о взаимосвязях между объектами БД.
17 ноя 09, 21:04    [7942132]     Ответить | Цитировать Сообщить модератору
 Re: Системные таблиц. Узнать какие процедуры используют таблицу  [new]
dennny
Member

Откуда:
Сообщений: 590
Так какой же способ реально работает - только ручной вариант ?
17 ноя 09, 21:52    [7942241]     Ответить | Цитировать Сообщить модератору
 Re: Системные таблиц. Узнать какие процедуры используют таблицу  [new]
nibo
Guest
SELECT Name
FROM syscomments
INNER JOIN sysobjects ON syscomments.ID = sysobjects.ID
WHERE Text LIKE '%ИмяТаблицы%'
18 ноя 09, 06:52    [7942755]     Ответить | Цитировать Сообщить модератору
 Re: Системные таблиц. Узнать какие процедуры используют таблицу  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Для версии >=90 в большинстве случаев поможет это:
SELECT [name],[type]
FROM sys.objects
WHERE OBJECT_DEFINITION([object_id]) LIKE N'%ИмяТаблицы%';
В случае, если в динамическом запросе имя таблицы генерируется
(из разных частей; вызовом функции; SELECTами и т.п.), ничего не поможет.
18 ноя 09, 09:11    [7942970]     Ответить | Цитировать Сообщить модератору
 Re: Системные таблиц. Узнать какие процедуры используют таблицу  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
iap
Для версии >=90 в большинстве случаев поможет это:
SELECT [name],[type]
FROM sys.objects
WHERE OBJECT_DEFINITION([object_id]) LIKE N'%ИмяТаблицы%';
В случае, если в динамическом запросе имя таблицы генерируется
(из разных частей; вызовом функции; SELECTами и т.п.), ничего не поможет.
Разве что LIKE надо усовершенствовать, чтобы он пропускал строки, только часть которых совпадает с именем таблицы.

Да! Я забыл ещё про комментарии. Там ведь тоже может быть имя искомой таблицы.
Так что возможны "ложные срабатывания"
18 ноя 09, 09:15    [7942993]     Ответить | Цитировать Сообщить модератору
 Re: Системные таблиц. Узнать какие процедуры используют таблицу  [new]
GlebZ
Member

Откуда: USA
Сообщений: 284
Ну на выше 2005 лучше:
SELECT DISTINCT object_name(object_id) FROM sys.sql_modules where definition LIKE '%TableName%'
А ещё лучше скинуть в скрипты и grepом, предварительно удалив комменты
Водку? Водку - буду!
18 ноя 09, 21:04    [7947492]     Ответить | Цитировать Сообщить модератору
 Re: Системные таблиц. Узнать какие процедуры используют таблицу  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
GlebZ
Ну на выше 2005 лучше:
Чем лучше?
18 ноя 09, 21:19    [7947517]     Ответить | Цитировать Сообщить модератору
 Re: Системные таблиц. Узнать какие процедуры используют таблицу  [new]
GlebZ
Member

Откуда: USA
Сообщений: 284
iap
GlebZ
Ну на выше 2005 лучше:
Чем лучше?

Ну, хотя-бы тем, что в syscomments имя таблицы может оказаться в виде:
Имя
Таблицы
.
18 ноя 09, 23:45    [7947901]     Ответить | Цитировать Сообщить модератору
 Re: Системные таблиц. Узнать какие процедуры используют таблицу  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
нету у iap никаких syscomments.
Или просто не на то сообщение отвечали?

-------------------------
There’s no silver bullet!
19 ноя 09, 00:05    [7947963]     Ответить | Цитировать Сообщить модератору
 Re: Системные таблиц. Узнать какие процедуры используют таблицу  [new]
GlebZ
Member

Откуда: USA
Сообщений: 284
locky
нету у iap никаких syscomments.
Или просто не на то сообщение отвечали?

-------------------------
There’s no silver bullet!

А у nibo есть.
19 ноя 09, 00:43    [7948109]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить