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

Откуда: Москва
Сообщений: 451
Всем привет!
Глядя на вот этот пост (13289840) наткнулся по полезную вещь: можно в базе отпределить список процедур (функций, вьюх...), которые обращаются к несуществующим таблицам, заполняют не все аргументы функций и делаю прочие нехорошие вещи.

Короче, представленных код помогает найти кое-какой мусор в программных объектах БД.

Выкладываю этот код для вашей критики. Вполне возможно, что для многих это баян, но может кому-то пригодится :-)
set nocount on;

declare @object_type sysname, @object_name sysname;
declare @t table (id int);

if object_id('tempdb..#badobjects') is not null drop table #badobjects
create table #badobjects (
	otype sysname not null,
	oname sysname not null,
	message varchar(max) null
	);

declare cr cursor local static
for
	select o.type_desc, schema_name(o.schema_id) + '.' + o.name
	from sys.objects o
	where 1=1
		--and o.Type in ('p')
	;

open cr;
fetch next from cr into @object_type, @object_name;
while @@fetch_status=0
begin
	begin try

	insert @t (id)
	select
		1
	from
		sys.dm_sql_referenced_entities(@object_name, 'OBJECT') r

	end try
	begin catch
		insert #badobjects (otype, oname, message)
		values (@object_type, @object_name, error_message());
		
	end catch

	fetch next from cr into @object_type, @object_name;
end;
close cr;
deallocate cr;

select *
from #badobjects
order by oname, otype;


------------------------------------------
P.S. В таблице #badobjects сохраняется только текст последней ошибки. Иногда функция sys.dm_sql_referenced_entities выводит несколько сообщений, первое из которых более содержательно. Как это сделать без клиента и xp_cmdshell я не смог придумать.

Так что, если нужна более подробная информация об ошибке в процедуре/функции/вьюхе, надо выполнить следующее:
select
	1
from
	sys.dm_sql_referenced_entities('dbo.AccountGet', 'OBJECT') r


Msg 207, Level 16, State 1, Procedure AccountGet, Line 21
Invalid column name 'CurrencyID'.
Msg 207, Level 16, State 1, Procedure AccountGet, Line 12
Invalid column name 'Sign'.
Msg 2020, Level 16, State 1, Line 1
The dependencies reported for entity "dbo.AccountGet" do not include references to 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.
11 янв 13, 12:42    [13753062]     Ответить | Цитировать Сообщить модератору
 Re: Проверь свою БД!  [new]
savosin_sergey
Member

Откуда: Москва
Сообщений: 451
P.S. Замечу, что функция sys.dm_sql_referenced_entities доступна в MSSQL начиная с версии 2008 (10.0).
P.P.S. Ещё замечу, что по сравнению с указанным в начале постом 13289840 я ничего нового, по сути, не сделал :-) Просто пост netivan-а я нашёл после того, как написал свой скрипт...
11 янв 13, 12:50    [13753135]     Ответить | Цитировать Сообщить модератору
 Re: Проверь свою БД!  [new]
ROLpogo
Member

Откуда: Реутов
Сообщений: 219
Спасибо! Очень полезный скрипт!
14 янв 13, 14:40    [13767006]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить