Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: вытащить упоминания вьюшек из процедуры  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
Mnior
CREATE A -> CREATE B (USE A) -> ALTER A
То всё, зависимость потерялась. ALTER уничтожает старые зависимости.
Не потеряется. Потеряется, если
CREATE A -> CREATE B (USE A) -> DROP A -> CREATE A
И то только в sys.sql_dependencies. В sys.sql_expression_dependencies зависимость останется.
19 сен 12, 00:52    [13185830]     Ответить | Цитировать Сообщить модератору
 Re: вытащить упоминания вьюшек из процедуры  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
beg_inner
invm
select
 r.referenced_server_name,
 r.referenced_database_name,
 r.referenced_schema_name,
 r.referenced_entity_name
from
 sys.dm_sql_referenced_entities('my_sp', 'object') r join
 sys.objects o on o.object_id = r.referenced_id
where
 r.referenced_class_desc = 'OBJECT_OR_COLUMN' and
 r.referenced_minor_id = 0 and
 o.type = 'V';
код от invm вываливается с ошибкой
А можете ошибку показать?
Если чё зарегим.
19 сен 12, 10:41    [13186871]     Ответить | Цитировать Сообщить модератору
 Re: вытащить упоминания вьюшек из процедуры  [new]
invm
Member

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

У нее штатное поведение. Описано вот тут -- http://msdn.microsoft.com/en-us/library/cc879246(v=SQL.105).aspx
19 сен 12, 10:53    [13186975]     Ответить | Цитировать Сообщить модератору
 Re: вытащить упоминания вьюшек из процедуры  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
invm
У нее штатное поведение.
IMXO правильно, ибо нефиг.
Кстати в статье как раз про ALTER и говорится.
И когда-то давно я это и видел, видимо сейчас уже не актуально.

+ Но отмазаться можно. Типа.
USE tempdb
GO
CREATE TABLE dbo.Test1 (ID Int, Data VarChar);
GO
CREATE PROCEDURE dbo.Test2 AS SELECT * FROM dbo.Test1;
GO
SELECT * FROM sys.sql_dependencies WHERE object_id = object_id('dbo.test2')
ALTER TABLE dbo.Test1 DROP COLUMN ID;
ALTER TABLE dbo.Test1 ADD ID Int;
ALTER TABLE dbo.Test1 DROP COLUMN Data;
--ALTER TABLE dbo.Test1 ADD Data VarChar;
SELECT * FROM sys.sql_dependencies WHERE object_id = object_id('dbo.test2')
GO
DROP TABLE dbo.Test1
DROP PROCEDURE dbo.Test2
GO
Спасибо за ссылку.
19 сен 12, 19:09    [13191588]     Ответить | Цитировать Сообщить модератору
 Re: вытащить упоминания вьюшек из процедуры  [new]
beg_inner
Guest
в общем, проделала сегодня эксперименты,
картина такая:

-- 1: dm_sql_referenced_entities
-- 2: sql_expression_dependencies
-- ms: MS -- view dependencies
-- sql_dep: sql_dependencies

--                           1    2  ms  sql_dep    
--create proc; no view       err  0  1     0
--create proc; create view   1    1  1     0 


т.е. самое позорное это sql_dependencies,
не реагирует на вновь созданное вью, если процедура создана, когда вью не было.
и даже если его потом создать, sql_dependencies это не отразит.

на 2-ом месте по позорности студийное view dependencies.
оно выдает упоминание о вью в процедуре, даже если вью еще и в помине нет,
правда показывет его не как вью, а как unresolved entity. ок, молодец.
но! оно не все вью выдает все равно. т.е. у меня на работе есть вьюха,
из которой в явном нединамическом виде есть селект в процедуре.
но MS ее не выдает в списке. никак не пойму, чем это вью от других отличается.

на 3-ем месте dm_sql_referenced_entities,
оно выдает ту вьюху, которую замыливает MS.
но при этом валится с ошибкой, если создать процедуру, в которой селект из вью, которого еще нет.

самое адекватное это sql_expression_dependencies.
если в процедуре есть селект из несуществующего вью, вью не показывается, и ошибки нет.
+ тоже показывает загадочное вью, не отлавливаемое студией.

на ALTER VIEW не реагировал никто.

зато ни один из способов не выдает вью, если в конце процедуры есть его DROP.
кто-нибудь знает способ отлавливания тех вью, которых дропают в процедуре?
19 сен 12, 23:26    [13192862]     Ответить | Цитировать Сообщить модератору
 Re: вытащить упоминания вьюшек из процедуры  [new]
beg_inner
Guest
iap
SELECT [type],[name]
FROM sys.objects
WHERE CHARINDEX([name],OBJECT_DEFINITION(OBJECT_ID(N'my_sp','P')))>0;


забыла сказать.
этот способ вылавливает и дропы тоже.
но кроме вхождения в виде подстроки, огребает такую кучу закомментаренных объектов,
что мама не горюй
(а выкинуть комментарии не по делу(не пояснения, а типа столетней давности код) запрещено
19 сен 12, 23:42    [13192898]     Ответить | Цитировать Сообщить модератору
 Re: вытащить упоминания вьюшек из процедуры  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
beg_inner
самое адекватное это sql_expression_dependencies.
если в процедуре есть селект из несуществующего вью, вью не показывается, и ошибки нет.
+ тоже показывает загадочное вью, не отлавливаемое студией.

на ALTER VIEW не реагировал никто.

зато ни один из способов не выдает вью, если в конце процедуры есть его DROP.
кто-нибудь знает способ отлавливания тех вью, которых дропают в процедуре?

Все показывается: и существующие объекты, и не существующие, и даже удаляемые в процедуре
use tempdb;
go

create view dbo.TestView as select 1 as v;
go

create procedure dbo.spTest
as
begin
 select * from dbo.TestTable;
 select * from dbo.TestView;
 
 drop view dbo.TestView;
end;
go

select
 referenced_schema_name, referenced_entity_name, referenced_id
from
 sys.sql_expression_dependencies
where
 referencing_id = object_id('dbo.spTest', 'P');
go

create table dbo.TestTable (i int);
go

select
 referenced_schema_name, referenced_entity_name, referenced_id
from
 sys.sql_expression_dependencies
where
 referencing_id = object_id('dbo.spTest', 'P');
go

drop procedure dbo.spTest;
drop table dbo.TestTable;
drop view dbo.TestView;
go

Какую именно реакцию вы ожидали увидеть на ALTER VIEW?
19 сен 12, 23:50    [13192913]     Ответить | Цитировать Сообщить модератору
 Re: вытащить упоминания вьюшек из процедуры  [new]
invm
Member

Откуда: Москва
Сообщений: 9827
И да, drop не есть "SQL expression". Поэтому, упоминаемая в drop сущность не будет в зависимостях.
20 сен 12, 00:31    [13193007]     Ответить | Цитировать Сообщить модератору
 Re: вытащить упоминания вьюшек из процедуры  [new]
beg_inner
Guest
invm, пардон, наврала.
не показывает, если есть только дроп

alter procedure dbo.spTest
as
begin
 --select * from dbo.TestTable;
 --select * from dbo.TestView;
 
 drop view dbo.TestView;
end;
go



и не показывает tbl, если в процедуре делаем DROP TABLE tbl и тут же CREATE TABLE tbl(...)
/просто CREATE TABLE tbl(...) /просто DROP TABLE tbl/ DROP TABLE tbl; SELECT * INTO tbl FROM... .
изначально речь шла о вьюхах, т.к. их не досчитались, а таблицы вроде были все.
но оказалось, таблицы, дропнутые/созданные в процедуре тоже теряются, а их тоже надо,
откуда бы их получить?

про ALTER VIEW идея не моя, а Mnior.
вчера вечером ответ прочла, днем проверила.
думала, может потерявшаяся вьюха была изменена ALTER VIEW.
ну или что еще с ней можно было сделать?
у меня фантазии не хватает, почему студия ее одну из всех не показывает
20 сен 12, 00:45    [13193042]     Ответить | Цитировать Сообщить модератору
 Re: вытащить упоминания вьюшек из процедуры  [new]
beg_inner
Guest
invm
И да, drop не есть "SQL expression". Поэтому, упоминаемая в drop сущность не будет в зависимостях.

ок, пока писала, уже вперед ответили.
ну а хотя бы CREATE TABLE и SELECT INTO
можно откуда-то получить?
20 сен 12, 00:48    [13193045]     Ответить | Цитировать Сообщить модератору
 Re: вытащить упоминания вьюшек из процедуры  [new]
invm
Member

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

Как всегда, спасет документация -- http://msdn.microsoft.com/en-us/library/ms345449%28v=SQL.105%29.aspx, раздел How Dependency Information Is Tracked
20 сен 12, 00:48    [13193048]     Ответить | Цитировать Сообщить модератору
 Re: вытащить упоминания вьюшек из процедуры  [new]
beg_inner
Guest
locky
http://www.sqlcodeguard.com/downloads/SqlCodeGuard.test.msi


на работе интернет отрубили совсем, я так понимаю, раз он msi,
то без интернета не поставится, правильно?
попробую дома в выходные, но проблема-то на работе...
20 сен 12, 00:52    [13193055]     Ответить | Цитировать Сообщить модератору
 Re: вытащить упоминания вьюшек из процедуры  [new]
beg_inner
Guest
invm
beg_inner,

Как всегда, спасет документация -- http://msdn.microsoft.com/en-us/library/ms345449%28v=SQL.105%29.aspx, раздел How Dependency Information Is Tracked

так она не спасает, она убивает последнюю надежду:

Entities referenced in the definition of a Transact-SQL module by using Data Definition Language (DDL) statements such as CREATE, ALTER, or DROP are not tracked

а не через зависимости?
есть ли еще какой способ, ну iap же предложил альтернативу...
просто именно в моем случае, где в процедуре больше кода в комментариях, чем просто кода, это не подходит
20 сен 12, 00:58    [13193068]     Ответить | Цитировать Сообщить модератору
 Re: вытащить упоминания вьюшек из процедуры  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
beg_inner
locky
http://www.sqlcodeguard.com/downloads/SqlCodeGuard.test.msi


на работе интернет отрубили совсем, я так понимаю, раз он msi,
то без интернета не поставится, правильно?
попробую дома в выходные, но проблема-то на работе...


ну... его надо скачать и проинсталлить
он совершенно автономный, инет нужен только чтобы скачать
20 сен 12, 01:28    [13193147]     Ответить | Цитировать Сообщить модератору
 Re: вытащить упоминания вьюшек из процедуры  [new]
beg_inner
Guest
locky,
ну...размер наводил на мысль, что как .net framework ...запустится и полезет в интернет скачиваться. короче, скачала, убегаю, буду пробовать.
проверим на предмет drop-ов
20 сен 12, 08:18    [13193436]     Ответить | Цитировать Сообщить модератору
 Re: вытащить упоминания вьюшек из процедуры  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
beg_inner
locky,
ну...размер наводил на мысль, что как .net framework ...запустится и полезет в интернет скачиваться. короче, скачала, убегаю, буду пробовать.
проверим на предмет drop-ов

ну вот такой вот он маленький
если бы не автономность самих аддинов - был бы еще в 2 раза меньше, но получилось вот так как-то.
20 сен 12, 09:08    [13193562]     Ответить | Цитировать Сообщить модератору
 Re: вытащить упоминания вьюшек из процедуры  [new]
Goodkov1
Guest
locky
beg_inner,

http://www.sqlcodeguard.com/downloads/SqlCodeGuard.test.msi
установить->ssms->Выбрать в object explorer базу->tools->Show dependencies->Build dependencies->conext menu->Dump dependencies
Билд толком не провереный, в некоторых местах может отпадать, но зависимости должны строится нормально


Сорри за оффтоп.

Эта ваша утилита?

Давно хочу попробовать, но на следующей конфигурации он у меня в студии не появляется
Сервер: Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64)
Jun 17 2011 00:54:03
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)

Студия:
Microsoft SQL Server Management Studio 11.0.2100.60
Компоненты доступа к данным (MDAC) 6.1.7601.17514
Microsoft MSXML 3.0 4.0 6.0
Microsoft Internet Explorer 9.0.8112.16421
Microsoft .NET Framework 4.0.30319.17929
Операционная система 6.1.7601
20 сен 12, 10:03    [13193876]     Ответить | Цитировать Сообщить модератору
 Re: вытащить упоминания вьюшек из процедуры  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Goodkov1,

ssms2012 пока не поддерживается - там какие-то странные проблемы с окнами и проч.
20 сен 12, 10:10    [13193925]     Ответить | Цитировать Сообщить модератору
 Re: вытащить упоминания вьюшек из процедуры  [new]
beg_inner
Guest
отчитываюсь.
сперва, чисто чтоб проверить, будет ли table из DROP TABLE в зависимостях, создала процедуру вида:
create proc dbo.sp_drop_proc as
drop table dbo.tbl_test;


таблицa dbo.tbl_test не существует.
опрашиваю зависимости.
да, показывает.

радуюсь и думаю, надо еще проверить drop, create, select into и динамику.
модифицирую процедуру как на картинке.
снова запускаю зависимости.
ничего не изменилось.

думаю, ок, может не канает, создам новую процедуру, куда всего напихаю.
написала dbo.sp_proc2.
запускаю зависимости. ну не обновляет, даже просто новую процедуру не показывает.
думаю, ок, закрою все, перезапущу студию.
снова встаю на ту же базу с всего-то этими двумя процедурами, вызываю зависимости.
ну не показывает.
тогда создаю новую базу и в ней создаю единственную процедуру, в которой напихано всего:
динамика, drop, create, select into.
встаю на эту новую базу и жму зависимости.
выдает пустой из всего 2ух тегов:
<dependencies>
</dependencies>

может, у меня Экспресс какой-то глючный?
именно на нем по правой кнопке в студии на зависимостях вываливается окно с ошибкой(в начале топика вывешивала)

К сообщению приложен файл. Размер - 70Kb
20 сен 12, 22:04    [13198861]     Ответить | Цитировать Сообщить модератору
 Re: вытащить упоминания вьюшек из процедуры  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
весьма странно
у меня для скрипта
alter proc sp_droproc
as 
drop table dbo.tbl_test1
exec('select * from dbo.tbl_dyn')
create table dbo.tbl_create1(id int)
select * from dbo.tbl_after_create_proc1;
go
alter proc sp_proc2
as
drop table dbo.tbl_test2;
exec ('select * from dbo.tbl_dyn');
create table dbo.tbl_create2(id int);
select * from dbo.tbl_after_create_proc2;
truncate table dbo.tbl_truncate
drop index xxx on dbo.tbl_index
alter index all on tbl_alter rebuild
go

выдало такие зависимости

<dependencies>
	<object type="P" name="dbo.sp_droproc">
		<object type="U" name="dbo.tbl_test1"/>
		<object type="U" name="dbo.tbl_create1"/>
		<object type="U" name="dbo.tbl_after_create_proc1"/>
	</object>
	<object type="P" name="dbo.sp_proc2">
		<object type="U" name="dbo.tbl_test2"/>
		<object type="U" name="dbo.tbl_create2"/>
		<object type="U" name="dbo.tbl_after_create_proc2"/>
		<object type="U" name="dbo.tbl_truncate"/>
		<object type="U" name="dbo.tbl_index"/>
	</object>
</dependencies>


alter index выпал, я посмотрю, почему именно, но остальные моменты то остались.
Вы уверены что после пересоздания/изменения процедур вы перестраивали зависимости и делали это на правильной базе?
20 сен 12, 23:11    [13199040]     Ответить | Цитировать Сообщить модератору
 Re: вытащить упоминания вьюшек из процедуры  [new]
beg_inner
Guest
может, у нас разные версии самого CodeGuard-а?
у меня 2.1.4644.37351
завтра на каждый шаг сделаю копию экрана.
и, если останется время, проверю на Энтерпрайзе.
там уже "полуавтоматическим способом", т.е. методом iap-а с последующей чисткой ручками список получен.
но эту же процедуру надо будет еще на паре баз проделать,
хотелось бы применить SQLCodeGuard, разультат как у Вас нам как раз и нужен.
индексы не нужны.
21 сен 12, 00:52    [13199327]     Ответить | Цитировать Сообщить модератору
 Re: вытащить упоминания вьюшек из процедуры  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
beg_inner
может, у нас разные версии самого CodeGuard-а?
у меня 2.1.4644.37351
завтра на каждый шаг сделаю копию экрана.
и, если останется время, проверю на Энтерпрайзе.

Нет, была использована именно это версия - специально посмотрел.
Скорее всего вы что-то пропустили из последовательности - это легко, нигде ведь не отображается - какая база и когда была пропарсена
21 сен 12, 12:26    [13201123]     Ответить | Цитировать Сообщить модератору
 Re: вытащить упоминания вьюшек из процедуры  [new]
beg_inner
Guest
в общем, на Экспрессе больше ситуация не повторилась.
зато с Энтерпрайзом вот что вышло:
задумался на приличное время, но все же построил зависимости,
открыл в новом окне, я побежала показать коллеге, приходим, от студии и следа не осталось.
т.е. испарилась вообще, хотя там были несохраненные запросы.
ок, думаю, ну вдруг кто захотел нагадить и все мне закрыл.
снова открываю MS, запускаю зависимости.
снова думает, но строит, все ок, хотим сохранить, выбираю куда, сохраняет и после сохранения MS спрашивает вроде:
в теksте есть символы в юникоде, к-ые будут потеряны, хотим сохранить в юникоде, да/нет?
пока думали, откуда там юникод и как лучше сохранить,
прямо у нас на глазах(коллега свидетель) студия испарилась.
не дождавшись ответа про юникод и не спросивши, надо ли остальное несохраненное сохранить.
наверное студия глючная.
но зато в неюникоде успело сохранить. полмегабайта xml-я.
подтверждаю: кроме динамики, все зависимости выцепляет: drop table, create table, select .. into tbl
комментарии игнорирует.
в общем, спасибо!
тут еще коллега дот.нет-чик спрашивает, можно ли исходники посмотреть.
если они не в открытом доступе, можете по почте поделиться?
22 сен 12, 09:15    [13205821]     Ответить | Цитировать Сообщить модератору
 Re: вытащить упоминания вьюшек из процедуры  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
забавное поведение
пока что это первый отрапартованный случай чтобы студия молча закрывалась. да и мне такое с 2005/2008 не встречалось
Анализ "за приличное время" - тоже занятный случай, по идее анализ должен быть довольно быстрым (у меня загружает и строит 30К объектов за 3 минуты примерно)
Исходники закрытые. Впрочем в них ничего особо интересного - обычный разбор в дерево и потом поиск в дереве подходящих "веток"
22 сен 12, 11:50    [13206014]     Ответить | Цитировать Сообщить модератору
 Re: вытащить упоминания вьюшек из процедуры  [new]
beg_inner
Guest
locky,
у нас 500K, если имелся в виду xml на выходе
22 сен 12, 17:48    [13206807]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить