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

Откуда:
Сообщений: 358
пока известное мне не даёт ответа на вопрос:

select * from INFORMATION_SCHEMA.ROUTINES
	select * from sys.all_objects where type = 'TR' order by create_date desc
	EXEC sp_helptext 'dbo.TR_MYTAXLIST';  


в наших краях (Oracle)это узнаётся "как 2 пальца"! (
select * from dba_objects where object_type = 'TRIGGER' and status != 'VALID' 
)
Но "сегодня сам попал в чужую деревню" ;-) Помогите плиз! )))
17 май 19, 12:16    [21887110]     Ответить | Цитировать Сообщить модератору
 Re: как программно узнать, валидны ли некоторые мои триггеры (до сих пор)?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31331
DBAshnik
в наших краях (Oracle)это узнаётся "как 2 пальца"!
А что в Оракле означает статус VALID?
17 май 19, 12:20    [21887117]     Ответить | Цитировать Сообщить модератору
 Re: как программно узнать, валидны ли некоторые мои триггеры (до сих пор)?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3673
В "чужой деревне" надо начинать с версии сервера.

select * from sys.triggers

https://docs.microsoft.com/en-us/sql/relational-databases/system-catalog-views/sys-triggers-transact-sql?view=sql-server-2017
17 май 19, 12:22    [21887119]     Ответить | Цитировать Сообщить модератору
 Re: как программно узнать, валидны ли некоторые мои триггеры (до сих пор)?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3673
alexeyvg
DBAshnik
в наших краях (Oracle)это узнаётся "как 2 пальца"!
А что в Оракле означает статус VALID?


валидный
17 май 19, 12:23    [21887120]     Ответить | Цитировать Сообщить модератору
 Re: как программно узнать, валидны ли некоторые мои триггеры (до сих пор)?  [new]
Sergey Syrovatchenko
Member

Откуда:
Сообщений: 134
alexeyvg
А что в Оракле означает статус VALID?

Показывает есть ли в скриптовом обьекте ссылки на какие-то невалидные обьекты. Скажем в тригере юзалась таблица. Ее удалили при вызове триггера рейтится ошибка и в системном представлении статут обьекта триггера меняется на INVALID. Если мне память не изменяет так в Оракле этот функционал работает.

DBAshnik
Помогите плиз!

Давно писал что-то в таком духе. Правда реализация не ахти, но вдруг выручит:
https://habr.com/en/post/222397/
17 май 19, 12:25    [21887124]     Ответить | Цитировать Сообщить модератору
 Re: как программно узнать, валидны ли некоторые мои триггеры (до сих пор)?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31331
Ролг Хупин
alexeyvg
А что в Оракле означает статус VALID?


валидный Картинка с другого сайта.
А, то есть в MSSQL аналог is_disabled?
Или имеется в виду, что код триггера соответствует бизне-логике из ТЗ? :-)
17 май 19, 12:25    [21887125]     Ответить | Цитировать Сообщить модератору
 Re: как программно узнать, валидны ли некоторые мои триггеры (до сих пор)?  [new]
invm
Member

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

Прямого аналога в MSSQL нет.

Можно выполнить
select * from sys.dm_sql_referenced_entities('dbo.TR_MYTAXLIST', 'object');
Если выполнилось без ошибок - значит валиден.
Если же в триггере есть DSQL, то гарантированно верный ответ получить нельзя.
17 май 19, 12:34    [21887133]     Ответить | Цитировать Сообщить модератору
 Re: как программно узнать, валидны ли некоторые мои триггеры (до сих пор)?  [new]
msLex
Member

Откуда:
Сообщений: 7998
Вот так можно выбрать все несуществующие объекты, на которые ссылаются триггер в базе

select 
	trigger_name = t.name
	, invalid_object_name = '[' + referenced_schema_name + '].[' + referenced_entity_name + ']'
from sys.triggers t
inner join sys.sql_expression_dependencies d on t.object_id = d.referencing_id
where 
	d.referenced_class = 1 
	and OBJECT_ID('[' + referenced_schema_name + '].[' + referenced_entity_name + ']') IS NULL



PS
Это без учета crossdb и crossserver связей

Первые приделать не сложно, со вторыми нужно будет помучаться.
17 май 19, 12:47    [21887157]     Ответить | Цитировать Сообщить модератору
 Re: как программно узнать, валидны ли некоторые мои триггеры (до сих пор)?  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33518
Блог
-- ссылки в объектах на отсутствующие объекты
select SCHEMA_NAME(t2.schema_id) as [Схема],
object_name(t1.referencing_id) as [Объект],
t1.referenced_class_desc as [Вид связи],
t1.referenced_server_name,
t1.referenced_database_name,
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 t2 on t2.object_id = t1.referencing_id
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%'
17 май 19, 13:03    [21887172]     Ответить | Цитировать Сообщить модератору
 Re: как программно узнать, валидны ли некоторые мои триггеры (до сих пор)?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7663
Критик,

похоже, запрос не учитывает XML_SCHEMA_COLLECTION.
17 май 19, 14:03    [21887252]     Ответить | Цитировать Сообщить модератору
 Re: как программно узнать, валидны ли некоторые мои триггеры (до сих пор)?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7663
Критик,

Интересно. что реагирует на конструкцию

params.exist('/row[@IsDisable eq "0"]'), где params - столбец XML типа.

OBJECT_OR_COLUMN params exist
17 май 19, 14:14    [21887267]     Ответить | Цитировать Сообщить модератору
 Re: как программно узнать, валидны ли некоторые мои триггеры (до сих пор)?  [new]
DBAshnik
Member

Откуда:
Сообщений: 358
Sergey Syrovatchenko
alexeyvg
А что в Оракле означает статус VALID?

Показывает есть ли в скриптовом обьекте ссылки на какие-то невалидные обьекты. Скажем в тригере юзалась таблица. Ее удалили при вызове триггера рейтится ошибка и в системном представлении статут обьекта триггера меняется на INVALID. Если мне память не изменяет так в Оракле этот функционал работает.


Естественно он работает!!!!!! Я В ЖИЗНИ не мог предположить что можно обойтись без этого!!!! Жесть!!!! :-(
А как же вы разруливаете следующее: В большой системе какие то олухи изменили какой-то обьект (скажем таблицу), который юзается где-то СОООООВСЕМ в другом месте! (они об этом не знали). Если ввести правило, что до и после изменения проверять (напр. автоматической рутиной), не появились ли где т.н. INVALIDы в результате каких-то манипуляций, то это значительно увеличивает стабильность системы и т.н. "защиту от дурака"!!!! Как же вы без этого живёте то, люди?!?!?
17 май 19, 16:26    [21887472]     Ответить | Цитировать Сообщить модератору
 Re: как программно узнать, валидны ли некоторые мои триггеры (до сих пор)?  [new]
DBAshnik
Member

Откуда:
Сообщений: 358
invm
DBAshnik,

Прямого аналога в MSSQL нет.

Можно выполнить
select * from sys.dm_sql_referenced_entities('dbo.TR_MYTAXLIST', 'object');
Если выполнилось без ошибок - значит валиден.


Спасибо! Попытался обернуть это функцией, и прикрутить её к селект запросу "select * from sys.triggers"
НО!!!!!!! Медленно и с ПОЛНЫМ УЖАСОМ(!!!) убеждаюсь что в function на MS-Sql оказывается нельзя встроить обработку EXCEPTION!!!
(типа дай мне 'VALID' если выполняется ок. и 'INVALID' в случае ошибки) (или таки можно?! version.2016)) Нахожусь в глубочайшем а*уе по этому поводу!!!! :-( ЖЕСТЬ КАК ОНА ЕСТЬ!!!!! :-( :-( :-( (это даже покруче будет, чем отсутствие "row-based"-триггеров! :-( )

invm
Если же в триггере есть DSQL, то ...

...то это уже на совести тех кто излишне ваял DSQL! Кстати в Оракле та же проблема! (именно поэтому многие Oracle-DBA гоняют сцаными тряпками проггеров за излишний DSQL!)

P.S. сегодня я cтал гораздо отчётливее понимать, ПОЧЕМУ Оракл стОит своих денег....................... ;-)
17 май 19, 16:37    [21887480]     Ответить | Цитировать Сообщить модератору
 Re: как программно узнать, валидны ли некоторые мои триггеры (до сих пор)?  [new]
DBAshnik
Member

Откуда:
Сообщений: 358
Ролг Хупин
В "чужой деревне" надо начинать с версии сервера.

select * from sys.triggers

https://docs.microsoft.com/en-us/sql/relational-databases/system-catalog-views/sys-triggers-transact-sql?view=sql-server-2017


2016
17 май 19, 16:39    [21887482]     Ответить | Цитировать Сообщить модератору
 Re: как программно узнать, валидны ли некоторые мои триггеры (до сих пор)?  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3673
[quot DBAshnik]
invm
DBAshnik,


P.S. сегодня я cтал гораздо отчётливее понимать, ПОЧЕМУ Оракл стОит своих денег....................... ;-)


да ладно
17 май 19, 17:25    [21887511]     Ответить | Цитировать Сообщить модератору
 Re: как программно узнать, валидны ли некоторые мои триггеры (до сих пор)?  [new]
DBAshnik
Member

Откуда:
Сообщений: 358
ах ты чёёёёрт:
))))))))))

называется: "Твоё лицо, когда в прокате дали машину неизвестной тебе доселе марки и посреди твоего чудесного отпускного путешествия по Африке внезапно выяснилось, что лампочки для фар вовсе не входят в базовый комплект и за ними надо бы заехать в ближайший магазин автозапчастей" )))))))))))))))))))))))))))))
17 май 19, 17:27    [21887514]     Ответить | Цитировать Сообщить модератору
 Re: как программно узнать, валидны ли некоторые мои триггеры (до сих пор)?  [new]
skyANA
Member

Откуда: Зеленоград
Сообщений: 27695
DBAshnik
Sergey Syrovatchenko
пропущено...

Показывает есть ли в скриптовом обьекте ссылки на какие-то невалидные обьекты. Скажем в тригере юзалась таблица. Ее удалили при вызове триггера рейтится ошибка и в системном представлении статут обьекта триггера меняется на INVALID. Если мне память не изменяет так в Оракле этот функционал работает.


Естественно он работает!!!!!! Я В ЖИЗНИ не мог предположить что можно обойтись без этого!!!! Жесть!!!! :-(
А как же вы разруливаете следующее: В большой системе какие то олухи изменили какой-то обьект (скажем таблицу), который юзается где-то СОООООВСЕМ в другом месте! (они об этом не знали). Если ввести правило, что до и после изменения проверять (напр. автоматической рутиной), не появились ли где т.н. INVALIDы в результате каких-то манипуляций, то это значительно увеличивает стабильность системы и т.н. "защиту от дурака"!!!! Как же вы без этого живёте то, люди?!?!?

Заставляем олухов тесты писать, прикинь :)
17 май 19, 18:27    [21887549]     Ответить | Цитировать Сообщить модератору
 Re: как программно узнать, валидны ли некоторые мои триггеры (до сих пор)?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
DBAshnik,

автор
А правило, что до и после изменения проверять (напр. автоматической рутиной), не появились ли где т.н. INVALIDы в результате каких-то манипуляций, то это значительно увеличивае

Schemabinding
17 май 19, 18:31    [21887553]     Ответить | Цитировать Сообщить модератору
 Re: как программно узнать, валидны ли некоторые мои триггеры (до сих пор)?  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33518
Блог
Владислав Колосов
Критик,

Интересно. что реагирует на конструкцию

params.exist('/row[@IsDisable eq "0"]'), где params - столбец XML типа.

OBJECT_OR_COLUMN params exist


вполне возможно,
запрос писался для DWH, где xml просто не было
17 май 19, 20:05    [21887603]     Ответить | Цитировать Сообщить модератору
 Re: как программно узнать, валидны ли некоторые мои триггеры (до сих пор)?  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3236
DBAshnik
Sergey Syrovatchenko
пропущено...

Показывает есть ли в скриптовом обьекте ссылки на какие-то невалидные обьекты. Скажем в тригере юзалась таблица. Ее удалили при вызове триггера рейтится ошибка и в системном представлении статут обьекта триггера меняется на INVALID. Если мне память не изменяет так в Оракле этот функционал работает.


Естественно он работает!!!!!! Я В ЖИЗНИ не мог предположить что можно обойтись без этого!!!! Жесть!!!! :-(
А как же вы разруливаете следующее: В большой системе какие то олухи изменили какой-то обьект (скажем таблицу), который юзается где-то СОООООВСЕМ в другом месте! (они об этом не знали). Если ввести правило, что до и после изменения проверять (напр. автоматической рутиной), не появились ли где т.н. INVALIDы в результате каких-то манипуляций, то это значительно увеличивает стабильность системы и т.н. "защиту от дурака"!!!! Как же вы без этого живёте то, люди?!?!?
Ведем разработку БД в SSDT, в тамошнем database project есть dependency tracking, который такие вещи сразу показывает.

Более того, оные "олухи" могут сначала проверить все зависимости таблицы, и по результатам уже попытаться понять, сломают их изменения что-нибудь где-нибудь, или нет.

Ну и триггеров по минимуму, но это для вас, похоже, религиозный вопрос
18 май 19, 16:43    [21887883]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить