powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / определить не валидные SP
33 сообщений из 33, показаны все 2 страниц
определить не валидные SP
    #39571918
Гулин Федор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день всем.

SQL 2014

Как можно определить все не валидные SP на БД
НЕ выполняя их
DDL накатываются в автомат.режиме - некоторые SP и View могут стать не валидными
из за изменения полей.

с View проще - можно сгенерить скрипт
Select top 200 * from View1,2,3 ...
выполнить - и ошибки вылезут сразу.

Вот бы такой фокус с SP - но выполнять их Нельзя ( это ETL - они загружают данные )
...
Рейтинг: 0 / 0
определить не валидные SP
    #39571920
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Выполнить их на тестовом окружении. Вообще, для этого придумали процесс тестирования.
...
Рейтинг: 0 / 0
определить не валидные SP
    #39571961
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гулин Федор,

А SET FMTONLY ON не спасет?
...
Рейтинг: 0 / 0
определить не валидные SP
    #39571964
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гулин ФедорНЕ выполняя их
Код: sql
1.
select * from sys.dm_sql_referenced_entities('процедура', 'object');

Даст ошибку.
...
Рейтинг: 0 / 0
определить не валидные SP
    #39571974
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы, для начала, вменяемо опишите, что такое "валидность" и "невалидность"(кстати, пишется в одно слово).
...
Рейтинг: 0 / 0
определить не валидные SP
    #39571976
Гулин Федор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmГулин ФедорНЕ выполняя их
Код: sql
1.
select * from sys.dm_sql_referenced_entities('процедура', 'object');

Даст ошибку.

ЗОЛОТЫЕ СЛОВА !!!
СПАСИБО

The dependencies reported for entity "[ETL].[Account_Receivable_Fact]" might not include references to all columns.
This is either because the entity references an object that does not exist or because of an error in one or more statements in the entity.
Before rerunning the query, ensure that there are no errors in the entity and that all objects referenced by the entity exist.



ЗЫ как чувствовал что-то такое должно быть
...
Рейтинг: 0 / 0
определить не валидные SP
    #39571986
Фотография Критик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
-- ссылки на отсутствующие объекты
select object_name(t1.referencing_id) as [Объект],
       t1.referenced_class_desc as [Вид связи],
       t1.referenced_schema_name as [Схема ссылочного объекта],
       t1.referenced_entity_name as [Имя ссылочного объекта],
       t3.object_id as [ID ссылочного объекта]
  from sys.sql_expression_dependencies as t1
  left join sys.objects as t3 on SCHEMA_NAME(t3.schema_id) = t1.referenced_schema_name and
                                 t3.name = t1.referenced_entity_name
  where t3.object_id is null and
        len(t1.referenced_schema_name) > 2 and    -- исключаем всякие with и прочее
        len(t1.referenced_entity_name) > 3 and    -- исключаем всякие with и прочее
        t1.referenced_schema_name is not null and -- исключаем, если схема не указана
        t1.referenced_database_name is null and   -- исключаем ссылки на другие базы данных
        t1.referenced_class_desc <> 'TYPE' and    -- исключаем табличные типы
        object_name(t1.referencing_id) <> 'sp_upgraddiagrams' and
        object_name(t1.referencing_id) not like '%for_del%'
...
Рейтинг: 0 / 0
определить не валидные SP
    #39572001
Minamoto
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Критик
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
-- ссылки на отсутствующие объекты
select object_name(t1.referencing_id) as [Объект],
       t1.referenced_class_desc as [Вид связи],
       t1.referenced_schema_name as [Схема ссылочного объекта],
       t1.referenced_entity_name as [Имя ссылочного объекта],
       t3.object_id as [ID ссылочного объекта]
  from sys.sql_expression_dependencies as t1
  left join sys.objects as t3 on SCHEMA_NAME(t3.schema_id) = t1.referenced_schema_name and
                                 t3.name = t1.referenced_entity_name
  where t3.object_id is null and
        len(t1.referenced_schema_name) > 2 and    -- исключаем всякие with и прочее
        len(t1.referenced_entity_name) > 3 and    -- исключаем всякие with и прочее
        t1.referenced_schema_name is not null and -- исключаем, если схема не указана
        t1.referenced_database_name is null and   -- исключаем ссылки на другие базы данных
        t1.referenced_class_desc <> 'TYPE' and    -- исключаем табличные типы
        object_name(t1.referencing_id) <> 'sp_upgraddiagrams' and
        object_name(t1.referencing_id) not like '%for_del%'


Добавьте в запрос еще "exist" и "value", иначе XML-запросы тоже в результат валит.
...
Рейтинг: 0 / 0
определить не валидные SP
    #39572020
Гулин Федор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
@Критик
Интересный запрос
СПС - мне пока надо тока НЕ валидные - я их списком нашел по ошибке как Invm указал


но думаю будет полезен в дальнейшем
не могу быстро сообразить как схему и тип (View , SP ) головоного объекта выдать
...
Рейтинг: 0 / 0
определить не валидные SP
    #39572305
Col
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гулин Федор ,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
	   SELECT
    '[' + OBJECT_SCHEMA_NAME(referencing_id) + '].[' + OBJECT_NAME(referencing_id) + ']' 
        AS [this sproc, UDF or VIEW...],
    isnull('[' + referenced_schema_name + '].', '') + '[' + referenced_entity_name + ']' 
        AS [... depends ON this missing entity name]
FROM 
    sys.sql_expression_dependencies
WHERE 
    is_ambiguous = 0 AND 
    (
        (
            [referenced_class_desc] = 'TYPE' and 
            TYPE_ID(
                isnull('[' + referenced_schema_name + '].', '') + 
                '[' + referenced_entity_name + ']'
            ) IS NULL
        ) or
        (   
            [referenced_class_desc] <> 'TYPE' and 
            OBJECT_ID(
                isnull('[' + referenced_schema_name + '].', '') + 
                '[' + referenced_entity_name + ']'
            ) IS NULL
        )
    )
ORDER BY 
    '[' + OBJECT_SCHEMA_NAME(referencing_id) + '].[' + OBJECT_NAME(referencing_id) + ']',
    isnull('[' + referenced_schema_name + '].', '') + '[' + referenced_entity_name + ']'
...
Рейтинг: 0 / 0
определить не валидные SP
    #39572321
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гулин Федор,

Кстати, все эти подходы не применимы в общем случае. А точнее, когда в процедурах используется динамический SQL. Очевидно, что если ссылка на объект содержится не в тексте процедуры, а в строковой констатнте, то и проверить эту ссылку без запуска процедуры невозможно.
Есть у меня решение, кстати, где подавляющее большинство хранимых процедур, выступающих в качестве источников данных отчетов, именно такие.
...
Рейтинг: 0 / 0
определить не валидные SP
    #39572551
wouef
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
и не только из-за динамического sql

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
use [tempdb]
go

-- создаём код
if exists (select 1 from sys.tables where object_id = OBJECT_ID(N'dbo.tableA')) drop table dbo.tableA;
go
create table dbo.tableA ( f1 int null );
go
insert into dbo.tableA ( f1 ) values ( 1 );
go

if exists (select 1 from sys.objects WHERE object_id = OBJECT_ID(N'dbo.functionA') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
	drop function dbo.functionA
GO

create function dbo.functionA ()
returns int
as begin
	return (select top (1) f1 from dbo.tableA);
end
go

-- всё работает
select OBJECT_NAME(object_id), object_id, modify_date from sys.all_objects where object_id in (OBJECT_ID(N'dbo.tableA'), OBJECT_ID(N'dbo.functionA'))
go
select dbo.functionA ();
go

-- меняем код
alter table dbo.tableA add f2 int null;
alter table dbo.tableA drop column f1;
go


-- dependencies ничего не видит
-- ссылки на отсутствующие объекты
select object_name(t1.referencing_id) as [Объект],
       t1.referenced_class_desc as [Вид связи],
       t1.referenced_schema_name as [Схема ссылочного объекта],
       t1.referenced_entity_name as [Имя ссылочного объекта],
       t3.object_id as [ID ссылочного объекта]
  from sys.sql_expression_dependencies as t1
  left join sys.objects as t3 on SCHEMA_NAME(t3.schema_id) = t1.referenced_schema_name and
                                 t3.name = t1.referenced_entity_name
  where t3.object_id is null and
        len(t1.referenced_schema_name) > 2 and    -- исключаем всякие with и прочее
        len(t1.referenced_entity_name) > 3 and    -- исключаем всякие with и прочее
        t1.referenced_schema_name is not null and -- исключаем, если схема не указана
        t1.referenced_database_name is null and   -- исключаем ссылки на другие базы данных
        t1.referenced_class_desc <> 'TYPE' and    -- исключаем табличные типы
        object_name(t1.referencing_id) <> 'sp_upgraddiagrams' and
        object_name(t1.referencing_id) not like '%for_del%'
GO


-- функция не работает
select dbo.functionA ();
go

-- смотрим почему
select N'dependencies работает, только если объекты ссылаются на более старые объекты'
go
select OBJECT_NAME(object_id), object_id, modify_date from sys.all_objects where object_id in (OBJECT_ID(N'dbo.tableA'), OBJECT_ID(N'dbo.functionA'))
go
...
Рейтинг: 0 / 0
определить не валидные SP
    #39572554
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем случае задача не решаема.
1. из-за динамических sql
2. из-за не всегда актуальных зависимостей
3. даже выполнение не поможет - может быть ветвление (параметры, разные условия, разные данные)
...
Рейтинг: 0 / 0
определить не валидные SP
    #39572558
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

авторThis includes dependences between natively compiled, scalar user-defined functions and other SQL Server modules
что надо сделать?
...
Рейтинг: 0 / 0
определить не валидные SP
    #39572559
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ролг Хупин,

автор3. даже выполнение не поможет - может быть ветвление (параметры, разные условия, разные данные)

ну компилируется без ветвлений
...
Рейтинг: 0 / 0
определить не валидные SP
    #39572580
wouef
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
был продукт https://www.osp.ru/cw/1998/12/28318/
который в Oracle для статичных sql (на тот момент в MSSQL поля modify_date не было) позволял исправлять dependencies с помощью alter.
...
Рейтинг: 0 / 0
определить не валидные SP
    #39572956
Гулин Федор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ptr128Гулин Федор,

Кстати, все эти подходы не применимы в общем случае. А точнее, когда в процедурах используется динамический SQL. Очевидно, что если ссылка на объект содержится не в тексте процедуры, а в строковой констатнте, то и проверить эту ссылку без запуска процедуры невозможно.
Есть у меня решение, кстати, где подавляющее большинство хранимых процедур, выступающих в качестве источников данных отчетов, именно такие.

Меня интерусует мой ЧАСТНЫЙ СЛУЧАЙ
а для моего частного случая - подсказка InvM мне уже помогла
я быстро понаходил ставшие не валидными SP

динам. скл в данном контектсе меня не интересует в принципе
у меня есть БД с > 100 SP и > 100 View
(причем там куча легаси к-е и могут стать НЕ валидными - и проверяю только саб-сет )

а Критику спасибо за его запрос

зы Увидел варинат Col
Смотрю сейчас его - вроде там Полные имена объектов
...
Рейтинг: 0 / 0
определить не валидные SP
    #39572960
Гулин Федор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вот лучше подскажите как типы объектов достать в запрос
любой из 2-х

мне бы выдать красиво
SP , View

SP там правда видны по префиоксу usp_
а вот таблицы от вьюх отличить с виду нельзя
...
Рейтинг: 0 / 0
определить не валидные SP
    #39572964
Фотография ptr128
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гулин ФедорМеня интерусует мой ЧАСТНЫЙ СЛУЧАЙ

Ну мне же откуда знать, встречается в Ваших процедурах динамический SQL или нет? Поэтому просто предупредил )
...
Рейтинг: 0 / 0
определить не валидные SP
    #39572966
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гулин Федор,

https://docs.microsoft.com/ru-ru/sql/relational-databases/system-compatibility-views/sys-sysobjects-transact-sql
Код: sql
1.
select name, type from sys.all_objects
...
Рейтинг: 0 / 0
определить не валидные SP
    #39572970
Cammomile
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
определить не валидные SP
    #39573073
Col
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гулин Федорзы Увидел варинат Col
Смотрю сейчас его - вроде там Полные имена объектов
Они самые, где-то еще был вариант прохода по всем базам с выводом и имени базы, но чет не нахожу в запаснике, видать затерелось где в черновиках.
...
Рейтинг: 0 / 0
определить не валидные SP
    #39573503
Гулин Федор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чисто косметические изменения под себя - чтобы типы объектов были
(я так понимаю по )
Всем СПАСИБО за идеи и обсуждение.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
SELECT
 o1.type_desc as Type1
,'[' + OBJECT_SCHEMA_NAME(referencing_id) + '].[' + OBJECT_NAME(referencing_id) + ']'  	AS [Obj1] -- this sproc, UDF or VIEW...
,isnull('[' + referenced_schema_name + '].', '') + '[' + referenced_entity_name + ']' 	AS [ref_obj]-- [... depends ON this missing entity name]
,a1.referencing_id
-- , a1.*
FROM 
sys.sql_expression_dependencies a1
LEFT JOIN   sys.all_objects o1
       ON o1.object_id = a1.referencing_id -- referenced_id
WHERE 
is_ambiguous = 0 
AND 
(
	(
		[referenced_class_desc] = 'TYPE' and 
		TYPE_ID(
			isnull('[' + referenced_schema_name + '].', '') + 
			'[' + referenced_entity_name + ']'
		) IS NULL
	) or
	(   
		[referenced_class_desc] <> 'TYPE' and 
		OBJECT_ID(
			isnull('[' + referenced_schema_name + '].', '') + 
			'[' + referenced_entity_name + ']'
		) IS NULL
	)
)
ORDER BY  1 ,2, 3 
;
...
Рейтинг: 0 / 0
определить не валидные SP
    #39573512
Гулин Федор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PS
мысль не закончил - в общем случае раз есть
referenced_server_name , referenced_database_name
то возможно найдет нестыковки и по ссылкам на другие БД и линк-сервера
но это я не проверял
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
определить не валидные SP
    #39916692
Гулин Федор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
через N лет возникла такая же задача
но чтобы еще выдавало с полями НЕ корректными
(последний запрос работает ОК )
но туда не попадают SP ссылающиеся на поля к-е были переимунованы

Код: sql
1.
EXEC sp_rename 'Debit.id_treb', 'Id_Debit', 'COLUMN'


причем в SSMS показывает красным но

Alter Procedure
без проблем

Как бы это отловить ставшие невалидными поля
(учитывая то что в #Temp таблицах они могут назыавться по старому)
любые идели велком
...
Рейтинг: 0 / 0
определить не валидные SP
    #39916707
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гулин Федор
Как бы это отловить ставшие невалидными поля
Зависимости от столбцов могут не храниться.

Получить желаемое можно с помощью sys.dm_sql_referenced_entities и анализа ошибок 207. Причем запуск из T-SQL бесполезен, ибо выдаст только последнюю ошибку.
Само-собой для DSQL этот способ не подойдет.
...
Рейтинг: 0 / 0
определить не валидные SP
    #39916715
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотя можно и на T-SQL извратиться. Примерно так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
use tempdb;
go

create procedure dbo.p
as
begin
 select c, d from dbo.t;
end;
go

create table dbo.t (a int, b int);
go

declare @s varchar(8000) = 'sqlcmd -S ' + quotename(@@servername, '"') + ' -E -d ' + quotename(db_name(), '"') + ' -Q ' + quotename('select * from sys.dm_sql_referenced_entities(''dbo.p'', ''object'')', '"')

declare @t table (s varchar(1000));
insert into @t
 exec xp_cmdshell @s;

select * from @t where s like 'Invalid column name%';
go

drop procedure dbo.p;
drop table dbo.t;
go
...
Рейтинг: 0 / 0
определить не валидные SP
    #39916718
Гулин Федор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm, СПС
не до конца понял
Invalid column name 'c'.
Invalid column name 'd'.
Код: sql
1.
select * from sys.dm_sql_referenced_entities('dbo.p', 'object')



да у меня выдает по конкретной SP ошибки - я понял вызов xp_cmdshell это обертка чтобы можно было найти
но SP меняющихся > 200 - и меняют 3+ человека
идея накатить на тест.окружение
и как-то одним (несколькими) запросами найти все ставшие НЕвалидными
...
Рейтинг: 0 / 0
определить не валидные SP
    #39916723
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гулин Федор
но SP меняющихся > 200 - и меняют 3+ человека
Что мешает пройтись циклом по перечню процедур и запускать предложенный код?
...
Рейтинг: 0 / 0
определить не валидные SP
    #39916731
Гулин Федор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,
СПС
да так и сделаю - получается цикл а не запрос
но задачу решит
...
Рейтинг: 0 / 0
определить не валидные SP
    #39916755
Гулин Федор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
к сожалению идея не прокатила

Код: sql
1.
select * from sys.dm_sql_referenced_entities('dbo.rep_GraphMoneyClientVal', 'object')



не ловит в запросах
case isnull(deb.Number111, 0) -- поменял на некорректное имя

красным да подсвечивает в SSMS

но не ловит
и это нав. правильно ибо там в SP есть #Tmp таблицы создаваемы ВНЕ (перед вызовом) даннызх SP

вообщем по ходу сложно это будет отловить автоматичкски.
...
Рейтинг: 0 / 0
определить не валидные SP
    #39916859
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гулин Федор
вообщем по ходу сложно это будет отловить автоматичкски.
Конечно, только что то, в некоторых случаях.
Как уже сказали, решается постановкой процессов разработки и тестирования.
...
Рейтинг: 0 / 0
определить не валидные SP
    #39916876
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гулин Федор
и это нав. правильно ибо там в SP есть #Tmp таблицы создаваемы ВНЕ (перед вызовом) даннызх SP
Конечно правильно - нельзя анализировать то, чего нет.
Вообще внешние временные таблицы в процедурах - пагубная практика. Особенно когда много одновременных соединений и мало ресурсов.
...
Рейтинг: 0 / 0
33 сообщений из 33, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / определить не валидные SP
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]