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

Откуда:
Сообщений: 38
BOL говорит "Можно создавать хранимые процедуры, ссылающиеся на еще не существующие таблицы."

А как определить, на какие таблицы ссылается хп и вывести их список? Только без запуска хп, так как при запуске надо анализировать, что делает хп и передавать параметры, а хп-шек и параметров много.

Этот список ссылок на таблицы потом можно сравнить с sys.tables и выяснить, будет ли запускаться ХП без ошибки "Недопустимое имя объекта ...".

Здесь обсуждалось нечто подобное:
[url=]https://www.sql.ru/forum/actualthread.aspx?bid=1&tid=683890&hl=%ed%e0%eb%e8%f7%e8%e5%20%ee%e1%fa%e5%ea%f2%ee%e2[/url]
но ответа там не нашел.
10 авг 11, 16:49    [11099361]     Ответить | Цитировать Сообщить модератору
 Re: Борьба с последствиями "отложенного разрешения имен".  [new]
Raoul
Member

Откуда:
Сообщений: 177
Правой кнопочкой на процедуру в SSMS и там пункт View Dependencies - оно?
10 авг 11, 16:55    [11099423]     Ответить | Цитировать Сообщить модератору
 Re: Борьба с последствиями "отложенного разрешения имен".  [new]
Alexs_001
Member

Откуда:
Сообщений: 38
автор
Raoul,
К сожалению, не оно. Там только существующие в БД таблицы :(

Если б не было "отложенного разрешения имен", то ХП не создавались бы, как раньше в стареньком SQL Server 7.5 и ниже. Сейчас создавай, что хочешь, а потом выгребай "Invalid object name".
10 авг 11, 17:02    [11099484]     Ответить | Цитировать Сообщить модератору
 Re: Борьба с последствиями "отложенного разрешения имен".  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
Или, если предпочитаете "скрипт-подход".
10 авг 11, 17:10    [11099550]     Ответить | Цитировать Сообщить модератору
 Re: Борьба с последствиями "отложенного разрешения имен".  [new]
invm
Member

Откуда: Москва
Сообщений: 9823
Alexs_001,

В общем виде задача не решается даже написанием полноценного парсера T-SQL.
Так что берете sys.objects + sys.parameters, генерите вызов ХП со значениями параметров null и выполняете его при set noexec on. Если ошибок компиляции не будет, значит все нужные объекты есть.
10 авг 11, 17:26    [11099714]     Ответить | Цитировать Сообщить модератору
 Re: Борьба с последствиями "отложенного разрешения имен".  [new]
Alexs_001
Member

Откуда:
Сообщений: 38
А таки действительно, Raoul прав, только что заметил, что View Dependencies показывает несуществующие таблицы.

CREATE PROCEDURE sp_check_unexistent_obj
AS
SELECT * FROM unexitent_obj
И тут же View Dependencies показал unexitent_obj.

Осталось выяснить через Профайлер, как SQL Server умеет делать такие чудеса!!!

Спасибо!
10 авг 11, 17:29    [11099739]     Ответить | Цитировать Сообщить модератору
 Re: Борьба с последствиями "отложенного разрешения имен".  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Alexs_001
А таки действительно, Raoul прав, только что заметил, что View Dependencies показывает несуществующие таблицы.

CREATE PROCEDURE sp_check_unexistent_obj
AS
SELECT * FROM unexitent_obj
И тут же View Dependencies показал unexitent_obj.

Осталось выяснить через Профайлер, как SQL Server умеет делать такие чудеса!!!

Спасибо!
А если так:
CREATE PROCEDURE sp_check_unexistent_obj
AS
EXECUTE(N'SELECT * FROM unexitent_obj');
?
10 авг 11, 17:30    [11099756]     Ответить | Цитировать Сообщить модератору
 Re: Борьба с последствиями "отложенного разрешения имен".  [new]
Alexs_001
Member

Откуда:
Сообщений: 38
Alexs_001
А таки действительно, Raoul прав, только что заметил, что View Dependencies показывает несуществующие таблицы.

CREATE PROCEDURE sp_check_unexistent_obj
AS
SELECT * FROM unexitent_obj
И тут же View Dependencies показал unexitent_obj.

Осталось выяснить через Профайлер, как SQL Server умеет делать такие чудеса!!!

Спасибо!


ЭТО ТОЛЬКО НА SQL 2008 R2 !!!

ПРОВЕРИЛ НА SQL 2005 - НЕТУ unexitent_obj В ДЕРЕВЕ View Dependencies. Так что, всё впорядке, вопрос остается.

Будем искать, что придумали в SQL 2008.
10 авг 11, 17:56    [11099941]     Ответить | Цитировать Сообщить модератору
 Re: Борьба с последствиями "отложенного разрешения имен".  [new]
Alexs_001
Member

Откуда:
Сообщений: 38
iap
Alexs_001
А таки действительно, Raoul прав, только что заметил, что View Dependencies показывает несуществующие таблицы.

CREATE PROCEDURE sp_check_unexistent_obj
AS
SELECT * FROM unexitent_obj
И тут же View Dependencies показал unexitent_obj.

Осталось выяснить через Профайлер, как SQL Server умеет делать такие чудеса!!!

Спасибо!
А если так:
CREATE PROCEDURE sp_check_unexistent_obj
AS
EXECUTE(N'SELECT * FROM unexitent_obj');
?

Так - нету unexitent_obj в списке зависимых от sp_check_unexistent_obj объектов. Это на SQL 2008. Так что, всё в норме, это не галлюцинации:) На 2005, думаю, и подавно не будет. Ищем дальше...
10 авг 11, 18:09    [11100010]     Ответить | Цитировать Сообщить модератору
 Re: Борьба с последствиями "отложенного разрешения имен".  [new]
Raoul
Member

Откуда:
Сообщений: 177
iap
А если так:
CREATE PROCEDURE sp_check_unexistent_obj
AS
EXECUTE(N'SELECT * FROM unexitent_obj');
?

Вы бы еще так записали:
CREATE PROCEDURE sp_check_unexistent_obj
AS
DECLARE @query NVARCHAR(255);
SET @query = N'SELECT * FROM u' + NCHAR(UNICODE('n')) + N'exitent_obj'
EXECUTE(@query);
Понятное дело, такая зависимость показана не будет, поскольку динамические запросы при компиляции процедуры не парсятся.
10 авг 11, 19:27    [11100271]     Ответить | Цитировать Сообщить модератору
 Re: Борьба с последствиями "отложенного разрешения имен".  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
я сильно прошу прощения - а чего это такого у вас с системой случилось, что 208-ая ошибка такое беспокойство начала вызывать? вы массово решили избавиться от "лишних" таблиц? и при этом иного тестирования, кроме проверок хранимок на эту ошибку, предусматривать не собираетесь???
10 авг 11, 21:17    [11100549]     Ответить | Цитировать Сообщить модератору
 Re: Борьба с последствиями "отложенного разрешения имен".  [new]
Alexs_001
Member

Откуда:
Сообщений: 38
daw,
просто хочу узнать, от каких объектов зависит хранимая процедура.

Пока что, в VS создал dbproject, сделал импорт скрипта бд в проект, там всё и повылазило в виде предупреждений типа:
SQL04151: В Процедура: <sp> есть неразрешенная ссылка на Объект <t>.

Как это можно сделать средствами SQL? Хотя бы для таблиц.

В 2008м, может, и можно через профайлер увидеть, как получается список зависимых от хп таблиц, сравнить этот список с существующими таблицами из sys.tables, и выявить ссылки, отсутствующие в sys.tables, но у меня 2005й.
11 авг 11, 20:22    [11106474]     Ответить | Цитировать Сообщить модератору
 Re: Борьба с последствиями "отложенного разрешения имен".  [new]
Raoul
Member

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

Скачайте и поставьте SQL Server 2008 R2 Express Database and Management Tools, подключайтесь к SQL 2005 и спокойно смотрите зависимости.
11 авг 11, 21:53    [11106694]     Ответить | Цитировать Сообщить модератору
 Re: Борьба с последствиями "отложенного разрешения имен".  [new]
Alexs_001
Member

Откуда:
Сообщений: 38
Raoul
Скачайте и поставьте SQL Server 2008 R2 Express Database and Management Tools, подключайтесь к SQL 2005 и спокойно смотрите зависимости.

Не увидите Вы в SQL Server 2005 зависимых объектов типа "Неразрешенная сущность".
Смотрите генерируемые запросы в профайлере для 2005 и 2008. Они разные.

К сообщению приложен файл. Размер - 54Kb
15 авг 11, 13:33    [11119737]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить