Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / определить не валидные SP / 25 сообщений из 33, страница 1 из 2
19.12.2017, 12:41
    #39571918
Гулин Федор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить не валидные SP
Добрый день всем.

SQL 2014

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

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

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

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

Даст ошибку.
...
Рейтинг: 0 / 0
19.12.2017, 13:40
    #39571974
Cammomile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить не валидные SP
Вы, для начала, вменяемо опишите, что такое "валидность" и "невалидность"(кстати, пишется в одно слово).
...
Рейтинг: 0 / 0
19.12.2017, 13:43
    #39571976
Гулин Федор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить не валидные SP
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
19.12.2017, 13:55
    #39571986
Критик
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить не валидные SP
Код: 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
19.12.2017, 14:05
    #39572001
Minamoto
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить не валидные SP
Критик
Код: 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
19.12.2017, 14:25
    #39572020
Гулин Федор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить не валидные SP
@Критик
Интересный запрос
СПС - мне пока надо тока НЕ валидные - я их списком нашел по ошибке как Invm указал


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

Код: 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
19.12.2017, 22:13
    #39572321
ptr128
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить не валидные SP
Гулин Федор,

Кстати, все эти подходы не применимы в общем случае. А точнее, когда в процедурах используется динамический SQL. Очевидно, что если ссылка на объект содержится не в тексте процедуры, а в строковой констатнте, то и проверить эту ссылку без запуска процедуры невозможно.
Есть у меня решение, кстати, где подавляющее большинство хранимых процедур, выступающих в качестве источников данных отчетов, именно такие.
...
Рейтинг: 0 / 0
20.12.2017, 10:52
    #39572551
wouef
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить не валидные SP
и не только из-за динамического 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
20.12.2017, 10:55
    #39572554
Ролг Хупин
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить не валидные SP
В общем случае задача не решаема.
1. из-за динамических sql
2. из-за не всегда актуальных зависимостей
3. даже выполнение не поможет - может быть ветвление (параметры, разные условия, разные данные)
...
Рейтинг: 0 / 0
20.12.2017, 10:59
    #39572558
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить не валидные SP
Ролг Хупин,

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

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

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

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

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

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

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

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

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

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

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

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
20.12.2017, 17:43
    #39572970
Cammomile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить не валидные SP
...
Рейтинг: 0 / 0
20.12.2017, 21:12
    #39573073
Col
Col
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить не валидные SP
Гулин Федорзы Увидел варинат Col
Смотрю сейчас его - вроде там Полные имена объектов
Они самые, где-то еще был вариант прохода по всем базам с выводом и имени базы, но чет не нахожу в запаснике, видать затерелось где в черновиках.
...
Рейтинг: 0 / 0
21.12.2017, 13:01
    #39573503
Гулин Федор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить не валидные SP
чисто косметические изменения под себя - чтобы типы объектов были
(я так понимаю по )
Всем СПАСИБО за идеи и обсуждение.

Код: 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
21.12.2017, 13:05
    #39573512
Гулин Федор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить не валидные SP
PS
мысль не закончил - в общем случае раз есть
referenced_server_name , referenced_database_name
то возможно найдет нестыковки и по ссылкам на другие БД и линк-сервера
но это я не проверял
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
21.01.2020, 10:40
    #39916692
Гулин Федор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
определить не валидные SP
через N лет возникла такая же задача
но чтобы еще выдавало с полями НЕ корректными
(последний запрос работает ОК )
но туда не попадают SP ссылающиеся на поля к-е были переимунованы

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


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

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

Как бы это отловить ставшие невалидными поля
(учитывая то что в #Temp таблицах они могут назыавться по старому)
любые идели велком
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / определить не валидные SP / 25 сообщений из 33, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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