Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 MSSQL - чудит(sys.sql_modules)  [new]
Jaffar
Member

Откуда:
Сообщений: 633
Добрый день.
MS SQL Server 2005 sp1 Enterprise Edition

Суть проблемы в следующем:
*-текстовые объекты: тригеры, процедуры, функции и вьюхи.

При массовом пересоздании текстовых обьектов* для некоторых объектов происходит замена актуального кода(того который должен быть) на код,
более старый который действовал когда-то(2-3 года назад).
Более детально: беруться все объекты вышеобозначенных типов, потом береться его текст из sys.sql_modules,
потом в этом тексте слово create меняется на слово alter(не в тупую делается replace, а заменяется первое слово без учета коментариев,
вообщем заменяется нормально - это проверяли, - сравнивали длинну до замены слова и после - разница длинны получалась в 1 символ - как раз разница длинны слов alter и create).
Далее этот текст помещается в переменную varchar(max) - и делается exec(@Q).
Надо отметить что пересоздание обьектов производиться в цикле т.е. текст каждого обьекта выполняется отдельно друг от друга -
на каждый объект - свой exec.
При этом exec выполняется успешно, т.е. этот alter... проходит и текст объекта так сказать применяется без ошибок.
Перед тем как выполнить массовое пересоздание - я сохранил все тексты из sys.sql_modules в отдельную пользовательскую табличку(
object_id, name, type, schema, definition) - чтобы было видно что БЫЛО до пересоздания.
Потом выполнил массовое пересоздание, Далее связал эту табличку с sys.sql_modules вот так:
[sql]

select o.object_id, o.name, o.[schema], o.type, abs(len(m.definition) - o.def_len) diff
from tlex_ObjectsTEXT o with(nolock)
join sys.sql_modules m with(nolock) on m.object_id = o.object_id
where
len(m.definition) != o.def_Len--len(o.definition_original)
order by Diff desc
option(recompile)
[/sql]

запрос выдал мне 65 обьектов(всего было пересоздано около 20000)
Далее я сравнил тексты объектов сохраненных в табличке и текст из sys.sql_modules - он отличался.
Я посмотрел детально глазами выборочно несколько обектов - и выяснил что текст объекта который применился при
массовом пересоздании отличается от того что я сохранил в таблички и соотв. от того что работало на сервере до пересоздания,
то что сохранилось после пересоздания - имеет как бы более раннюю версию.
т.е. текст который был например в процедуре раньше(~ год назад) - при пересоздании опять вернулся и затер актуальный изменения.

Может кто с этим сталкивался?!!
Потому что это же вообще ужос какой-то.

P.S.:Если кто-то сомневается и думает что я ламер и что я просто где-то "затупил" - могу выложить процедуры пересоздания объектов.
29 сен 09, 10:48    [7718620]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL - чудит(sys.sql_modules)  [new]
Jaffar
Member

Откуда:
Сообщений: 633
Добрый день.
MS SQL Server 2005 sp1 Enterprise Edition

Суть проблемы в следующем:
*-текстовые объекты: тригеры, процедуры, функции и вьюхи.

При массовом пересоздании текстовых обьектов* для некоторых объектов происходит замена актуального кода(того который должен быть) на код,
более старый который действовал когда-то(2-3 года назад).
Более детально: беруться все объекты вышеобозначенных типов, потом береться его текст из sys.sql_modules,
потом в этом тексте слово create меняется на слово alter(не в тупую делается replace, а заменяется первое слово без учета коментариев,
вообщем заменяется нормально - это проверяли, - сравнивали длинну до замены слова и после - разница длинны получалась в 1 символ - как раз разница длинны слов alter и create).
Далее этот текст помещается в переменную varchar(max) - и делается exec(@Q).
Надо отметить что пересоздание обьектов производиться в цикле т.е. текст каждого обьекта выполняется отдельно друг от друга -
на каждый объект - свой exec.
При этом exec выполняется успешно, т.е. этот alter... проходит и текст объекта так сказать применяется без ошибок.
Перед тем как выполнить массовое пересоздание - я сохранил все тексты из sys.sql_modules в отдельную пользовательскую табличку(
object_id, name, type, schema, definition) - чтобы было видно что БЫЛО до пересоздания.
Потом выполнил массовое пересоздание, Далее связал эту табличку с sys.sql_modules вот так:
select o.object_id, o.name, o.[schema], o.type, abs(len(m.definition) - o.def_len) diff
from tlex_ObjectsTEXT o with(nolock)
join sys.sql_modules m with(nolock) on m.object_id = o.object_id
where
		len(m.definition) != o.def_Len--len(o.definition_original)
order by Diff desc
option(recompile)

запрос выдал мне 65 обьектов(всего было пересоздано около 20000)
Далее я сравнил тексты объектов сохраненных в табличке и текст из sys.sql_modules - он отличался.
Я посмотрел детально глазами выборочно несколько обектов - и выяснил что текст объекта который применился при
массовом пересоздании отличается от того что я сохранил в таблички и соотв. от того что работало на сервере до пересоздания,
то что сохранилось после пересоздания - имеет как бы более раннюю версию.
т.е. текст который был например в процедуре раньше(~ год назад) - при пересоздании опять вернулся и затер актуальный изменения.

Может кто с этим сталкивался?!!
Потому что это же вообще ужос какой-то.

P.S.:Если кто-то сомневается и думает что я ламер и что я просто где-то "затупил" - могу выложить процедуры пересоздания объектов.
29 сен 09, 10:51    [7718631]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL - чудит(sys.sql_modules)  [new]
Jaffar
Member

Откуда:
Сообщений: 633
Вот текст процедур по пересозданию объектов.
1.Эта процедура запускает в цикле процедуру которая пересоздает объект
ALTER    procedure [dev].[xp_recreateAll]
AS
--- процедура пересоздания всех объектов
declare @__TEMP table(t_ID numeric(16) identity(1, 1) not null, t_obj_ID numeric(18) not null unique)
declare @N numeric(16), @M numeric(16), @obj_ID numeric(18)

insert @__TEMP(t_obj_ID)
select distinct o.object_id
from sys.objects o with(nolock), sys.sql_modules m with(nolock)
where
				o.type in ('FN', 'IF', 'P', 'V', 'TR', 'TF')
		and
				m.object_id = o.object_id
		and
				len(IsNull(m.definition, '')) > 0

-- в таблицу валяться ошибки если объект не пересоздался по каким-либо причинам
delete from tlex_RecreatedObjects

select @N = min(t_ID), @M = max(t_ID) from @__TEMP

-- для каждого выполняем xp_recreate -
WHILE(@N <= @M)
BEGIN
select @obj_ID = t_obj_ID from @__TEMP where t_ID = @N
/*=======================================*/
		exec dev.xp_recreate @obj_ID
/*=======================================*/
    set @Obj_ID = NULL
	SET @N = @N + 1
END
go


2.Эта процедура берет текст объекта, меняет create на alter и делает exec.
ALTER procedure [dev].[xp_recreate](@obj_ID numeric(18))
AS
IF(exists(select 1
		from sys.objects o with(nolock), sys.sql_modules m with(nolock)
		where
				o.object_ID = @obj_ID
		and
				o.type in ('FN', 'IF', 'P', 'V', 'TR', 'TF')
		and
				m.object_id = o.object_id
		and
				len(IsNull(m.definition, '')) > 0))
BEGIN
declare @QUERY varchar(max), @count int set @QUERY = ' '

--- 1.выбираем текст объекта и меняем CREATE на ALTER
select @QUERY = dbo.bvf_RecreateProcAndFunctStr(m.definition, 1),
	   @count = len(m.definition)
from sys.sql_modules m with(nolock)
where
		m.object_id = @obj_ID

--- сохраняем разницу длинны для каждого обьекта
select @count = @count - len(@QUERY)
insert tlex_TEMPTEST(t_Value)
select 'object_id = '+isNULL(cast(@obj_ID as varchar(32)), 'NULL')+'; @count = '+IsNULL(cast(@count as varchar(32)), 'NULL')+';'

--- 3.Выполняем пересоздание
begin try
/*============*/
 EXEC(@QUERY)
/*============*/
end try

begin catch
/*=================================*/
--- сохраняем данные об исключении
insert tlex_RecreatedObjects(
		 ro_obj_ID,
		 ro_OLDTEXT,
		 ErrorNumber,
		 ErrorSeverity,
		 ErrorState,
		 ErrorProcedure,
		 ErrorLine,
		 ErrorMessage) 
values( @obj_ID,
		@QUERY,
		 ERROR_NUMBER(),
		 ERROR_SEVERITY(),
		 ERROR_STATE(),
		 ERROR_PROCEDURE(),
		 ERROR_LINE(),
		 ERROR_MESSAGE())
/*=================================*/
end catch
END

вот.
29 сен 09, 11:36    [7718980]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL - чудит(sys.sql_modules)  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
dbo.bvf_RecreateProcAndFunctStr
где текст ?
-------------------------------------
Jedem Das Seine
29 сен 09, 12:33    [7719448]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL - чудит(sys.sql_modules)  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

а у вас переименование процедур с помощью sp_rename не практикуется, случаем?

Posted via ActualForum NNTP Server 1.4

29 сен 09, 12:43    [7719556]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL - чудит(sys.sql_modules)  [new]
ura
Member [заблокирован]

Откуда: Киев
Сообщений: 932
Т.е. вы считаете, что sql server откуда-то вытащил старые версии процедур ? Мистика какая-то...
Дам пару советов, не совсем по теме:
- не привязывайтесь к id, лучше идентифицировать объекты по имени, тогда после drop-create связи останутся
- вместо цикла WHILE(@N <= @M) в процедуре xp_recreateAll используйте курсор, или хотя-бы находите следующий объект не инкрементом, поскольку object_id идут не последовательно
- зачем тут nolock: sys.sql_modules m with(nolock) ??

да, и кстати, почему название процедур начинается на xp_ ? это стандартный префикс для расширенных хранимых процедур

Для выявления проблемы можно создать DDL-триггер, для отслеживания, кто что меняет.
Тут пример моего триггера для логирования DDL-изменений, если нужно...
+

CREATE trigger [logA_DDL]
ON DATABASE 
FOR DDL_DATABASE_LEVEL_EVENTS 
AS

set nocount on
set ansi_nulls on
set ansi_padding on
set ansi_warnings on
set arithabort on
set concat_null_yields_null on
set numeric_roundabort off
set quoted_identifier on

if object_id('tempdb..#sg_disable_trigger_logA') is not null 
	or convert(bit, sessionproperty('replication_agent'))=1
	return

DECLARE @data XML
,@EventTp tinyint -- 1-insert(create), 2-delete(drop), 3-update(alter)
,@TranID varchar(255)
,@AutorId pk
,@TblId pk
,@EventId pk
,@ProcNm varchar(255)
,@Prior_date datetime
,@Prior_Autorid pk
,@EventType varchar(50)
,@VERS varchar(50)

set @data=EVENTDATA()

if @data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)') in ('create_statistics','update_statistics','drop_statistics')
return
-- Текущий юзер
select @AutorId=dbo.GetCurrentAutor()
-- Таблица
select @TblId=dbo.GetTblId('ddl')
if @TblId is NULL begin
	insert into tbl(tbl_nm)
	select 'ddl'
	select @TblId=SCOPE_IDENTITY()
end

select @EventTp=
    case when charindex('create',@data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)'))<>0 then 1
		 when charindex('drop',@data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)'))<>0 then 2
		 else 3 
	end
select @ProcNm=@data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'varchar(30)')

select top 1 @Prior_date=dt, @Prior_AutorId=autor_id, @EventId=event_id 
from event 
where tbl_id=@TblId and proc_nm=@ProcNm and event_tp=@EventTp 
order by dt desc

select @VERS=vers from config
if DATEDIFF(day, @Prior_date, GETDATE())<1 and @Prior_AutorId=@AutorId
begin
	delete from log_ddl where event_id=@Eventid 
	delete from event where event_id=@Eventid 
end
insert into event(tbl_id, autor_id, event_tp, dt, tran_id, proc_nm, host_nm)
select @TblId, @Autorid, @EventTp, GetDate(), @TranId, @ProcNm, host_name()
select @EventId=SCOPE_IDENTITY()

insert into log_ddl(event_id,event_tp,object_nm,ddl_text,vers)
values(@EventId, @EventTp, @ProcNm,	@data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(max)'), @VERS)
GO
29 сен 09, 12:52    [7719629]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL - чудит(sys.sql_modules)  [new]
Jaffar
Member

Откуда:
Сообщений: 633
Maxx
dbo.bvf_RecreateProcAndFunctStr
где текст ?
-------------------------------------
Jedem Das Seine


в этой функции происходит замена create на alter.
Я конечно код привел, но проблема 100% не в нем.
Ибо после пересоздания появляется "старый" текст - который является синтаксически правильным и соотв. применяется без ошибок.
ALTER function [dbo].[bvf_RecreateProcAndFunctStr] (@string varchar(max), @IsReplace bit = NULL)
returns varchar(max)
as
begin
--		declare @string varchar(max)
		declare @strFind varchar(16)
		declare @strRepl varchar(16)
		declare @ind0 int, @ind1 int, @ind2 int, @ind3 int, @ind4 int, @fl int, @cnt int

----#-BeginDebug
--		select @string = definition from sys.sql_modules (nolock) where object_id = @id
		set @strFind = 'create'
		set @strRepl = 'alter'


		select @ind0 = charindex(@strFind,@string)
		select @ind1 = charindex('/*',@string)
		select @ind2 = charindex('--',@string)
		select @fl=1
		if @ind1 = 0 begin select @ind1 = 99999 end
		if @ind2 = 0 begin select @ind2 = 99999 end
		if @ind1>@ind2 begin select @ind1 = @ind2, @fl = 2 end
		
		while @ind0 > @ind1 
		begin
				if @fl = 1 
				begin
						select @ind3 = charindex('*/',@string,@ind1+2)
						select @ind4 = charindex('/*',@string,@ind1+2)
						select @cnt = 0
						if @ind3 > @ind4 and @ind4 > 0 select @cnt = @cnt + 1, @ind2 = @ind4+2
						else select @cnt = @cnt - 1, @ind2 = @ind3+2
						while @cnt > -1
						begin
								select @ind3 = charindex('*/',@string,@ind2)
								select @ind4 = charindex('/*',@string,@ind2)
								if @ind3 > @ind4 and @ind4 > 0 select @cnt = @cnt + 1, @ind2 = @ind4+2
								else select @cnt = @cnt - 1, @ind2 = @ind3+2
						end
				end
				else
				begin
						select @ind2 = charindex(char(13),@string, @ind1+1)+1
						select @ind4 = charindex(char(10),@string, @ind1+1)+1
						if @ind2 = 0 select @ind2 = 999999
						if @ind4 = 0 select @ind4 = 999999
						if @ind2 > @ind4 select @ind2 = @ind4
						if @ind2 = 1 select @ind2 = len(@string)+1
				end


				while @ind0 < @ind2
				begin
						if @ind0 = 0 return ('error')
						select @ind0 = charindex(@strFind,@string,@ind0+1)
				end

				select @ind1 = charindex('/*',@string,@ind2)
				select @ind2 = charindex('--',@string,@ind2)
				select @fl=1
				if @ind1 = 0 begin select @ind1 = 99999 end
				if @ind2 = 0 begin select @ind2 = 99999 end
				if @ind1>@ind2 begin select @ind1 = @ind2, @fl = 2 end

		end

IF(@IsReplace = 1)  select @string = stuff(@string,@ind0,len(@strFind),@strRepl)

		return(@string)

--		print @string
----#-EndDebug
end
29 сен 09, 12:55    [7719654]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL - чудит(sys.sql_modules)  [new]
ura
Member [заблокирован]

Откуда: Киев
Сообщений: 932
да, и в догонку вопрос - зачем это все ? sp_recompile и sp_refreshview не достаточно ?
29 сен 09, 12:58    [7719684]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL - чудит(sys.sql_modules)  [new]
Jaffar
Member

Откуда:
Сообщений: 633
ura
Т.е. вы считаете, что sql server откуда-то вытащил старые версии процедур ? Мистика какая-то...
Дам пару советов, не совсем по теме:
- не привязывайтесь к id, лучше идентифицировать объекты по имени, тогда после drop-create связи останутся
- вместо цикла WHILE(@N <= @M) в процедуре xp_recreateAll используйте курсор, или хотя-бы находите следующий объект не инкрементом, поскольку object_id идут не последовательно
- зачем тут nolock: sys.sql_modules m with(nolock) ??

да, и кстати, почему название процедур начинается на xp_ ? это стандартный префикс для расширенных хранимых процедур

Для выявления проблемы можно создать DDL-триггер, для отслеживания, кто что меняет.
Тут пример моего триггера для логирования DDL-изменений, если нужно...


Ну скорее не мистика - а просто очередная дырка. такая же как в sys.dependencies.
Еще одно типа подтверждение что даже в таких системах есть маленькие дырочки из которых иногда течет.

1.К object_id я не привязываюсь - просто было лениво писать что-то типа где name = name and schema = schema.
Drop / Create - там не делается, там делается alter, а при нем object_id - остается прежний.

2.Вы просто не заметили что инкремент идет не по object_id а по ID табличной переменной, который есть identity(1, 1) - так что инкремент здесь вполне подходит.

3.nolock - экспериментально замечено что так работает быстрее.
29 сен 09, 13:03    [7719721]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL - чудит(sys.sql_modules)  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
sp_helptext 'sys.sql_modules'
sp_helptext 'sys.syscomments'

и все таки они разные, всегда использовал для таких операций последни вьюс
-------------------------------------
Jedem Das Seine
29 сен 09, 13:10    [7719793]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL - чудит(sys.sql_modules)  [new]
Jaffar
Member

Откуда:
Сообщений: 633
ura
да, и в догонку вопрос - зачем это все ? sp_recompile и sp_refreshview не достаточно ?


ну просто раньше я не знал про ЭТО.
и изначально стояла задача при пересоздании - добавлять комментарий в конец текстового объекат.
29 сен 09, 13:11    [7719801]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL - чудит(sys.sql_modules)  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

я таки повторю вопрос: переименованием процедур/функций не балуетесь?

Posted via ActualForum NNTP Server 1.4

29 сен 09, 13:12    [7719811]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL - чудит(sys.sql_modules)  [new]
Jaffar
Member

Откуда:
Сообщений: 633
daw

а у вас переименование процедур с помощью sp_rename не практикуется, случаем?


Лично я вообще считаю это дурным тоном - использование этой процедуры и дизайнера из management studio.
В основном переименовывают таблицы - как раз через дизайнер.

Про процедуры и функции не слышал чтобы кто-нить из коллег так делал.
Но там все-таки 20 000 объектов - возможно кто-то когда-то это делал.

А что? Раскройте ваши подозрения.
29 сен 09, 13:20    [7719872]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL - чудит(sys.sql_modules)  [new]
Jaffar
Member

Откуда:
Сообщений: 633
Maxx
dbo.bvf_RecreateProcAndFunctStr
где текст ?
-------------------------------------
Jedem Das Seine


в этой функции происходит замена create на alter.
Я конечно код привел, но проблема 100% не в нем.
Ибо после пересоздания появляется "старый" текст - который является синтаксически правильным и соотв. применяется без ошибок.
ALTER function [dbo].[bvf_RecreateProcAndFunctStr] (@string varchar(max), @IsReplace bit = NULL)
returns varchar(max)
as
begin
--		declare @string varchar(max)
		declare @strFind varchar(16)
		declare @strRepl varchar(16)
		declare @ind0 int, @ind1 int, @ind2 int, @ind3 int, @ind4 int, @fl int, @cnt int

----#-BeginDebug
--		select @string = definition from sys.sql_modules (nolock) where object_id = @id
		set @strFind = 'create'
		set @strRepl = 'alter'


		select @ind0 = charindex(@strFind,@string)
		select @ind1 = charindex('/*',@string)
		select @ind2 = charindex('--',@string)
		select @fl=1
		if @ind1 = 0 begin select @ind1 = 99999 end
		if @ind2 = 0 begin select @ind2 = 99999 end
		if @ind1>@ind2 begin select @ind1 = @ind2, @fl = 2 end
		
		while @ind0 > @ind1 
		begin
				if @fl = 1 
				begin
						select @ind3 = charindex('*/',@string,@ind1+2)
						select @ind4 = charindex('/*',@string,@ind1+2)
						select @cnt = 0
						if @ind3 > @ind4 and @ind4 > 0 select @cnt = @cnt + 1, @ind2 = @ind4+2
						else select @cnt = @cnt - 1, @ind2 = @ind3+2
						while @cnt > -1
						begin
								select @ind3 = charindex('*/',@string,@ind2)
								select @ind4 = charindex('/*',@string,@ind2)
								if @ind3 > @ind4 and @ind4 > 0 select @cnt = @cnt + 1, @ind2 = @ind4+2
								else select @cnt = @cnt - 1, @ind2 = @ind3+2
						end
				end
				else
				begin
						select @ind2 = charindex(char(13),@string, @ind1+1)+1
						select @ind4 = charindex(char(10),@string, @ind1+1)+1
						if @ind2 = 0 select @ind2 = 999999
						if @ind4 = 0 select @ind4 = 999999
						if @ind2 > @ind4 select @ind2 = @ind4
						if @ind2 = 1 select @ind2 = len(@string)+1
				end


				while @ind0 < @ind2
				begin
						if @ind0 = 0 return ('error')
						select @ind0 = charindex(@strFind,@string,@ind0+1)
				end

				select @ind1 = charindex('/*',@string,@ind2)
				select @ind2 = charindex('--',@string,@ind2)
				select @fl=1
				if @ind1 = 0 begin select @ind1 = 99999 end
				if @ind2 = 0 begin select @ind2 = 99999 end
				if @ind1>@ind2 begin select @ind1 = @ind2, @fl = 2 end

		end

IF(@IsReplace = 1)  select @string = stuff(@string,@ind0,len(@strFind),@strRepl)

		return(@string)

--		print @string
----#-EndDebug
end
29 сен 09, 13:24    [7719892]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL - чудит(sys.sql_modules)  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> А что? Раскройте ваши подозрения.

текст процедуры в syscomments/sys.sql_modules при переименовании
не меняется. то есть там остается старый текст - со старым именем
процедуры.
такого вот сценария замены процедуры на новую версию у вас не может
быть? это как раз к описанному эффекту может привести, если не ошибаюсь - при
замене create на alter вы имя не трогаете, вроде бы?
create proc testp
as
select 'old_ver'
go
create proc testp_new
as
select 'new_ver'
go
exec sp_rename 'testp', 'testp_old'
go
exec sp_rename 'testp_new', 'testp'
go
select object_name(object_id), definition
from sys.sql_modules
where object_id in(object_id('testp_old'), object_id('testp'))
go
drop proc testp_old
go
drop proc testp

Posted via ActualForum NNTP Server 1.4

29 сен 09, 13:26    [7719912]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL - чудит(sys.sql_modules)  [new]
Jaffar
Member

Откуда:
Сообщений: 633
да вы правы - косяк именно в этом.
29 сен 09, 13:45    [7720037]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL - чудит(sys.sql_modules)  [new]
Jaffar
Member

Откуда:
Сообщений: 633
ura
да, и в догонку вопрос - зачем это все ? sp_recompile и sp_refreshview не достаточно ?


Эти процедуры вызывают перекомпиляцию процедуры при следующем ее запуске,
а мне нужно было пересоздать объекты сейчас а не вызывать их все на выполнение.
http://msdn.microsoft.com/ru-ru/library/ms181647(SQL.90).aspx
29 сен 09, 15:05    [7720637]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL - чудит(sys.sql_modules)  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Jaffar,

Озвученные процедуры никогда не вызывали "объекты на выполнение".
29 сен 09, 17:00    [7721407]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL - чудит(sys.sql_modules)  [new]
Jaffar
Member

Откуда:
Сообщений: 633
pkarklin
Jaffar,

Озвученные процедуры никогда не вызывали "объекты на выполнение".


А кто об этом пишет?
Я говорю о том что пепекомпиляция процедуры и т.п. при применении этих процедур происходит только при следующем "выполнении" объекта.
А мне совсем не нужно было выполнять все 20000 объектов чтобы их перекомпилить.
Пересоздание было нужно для обновления связей между объектами т.к. в dependencies - они не всегда актуальны.
30 сен 09, 06:47    [7722825]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL - чудит(sys.sql_modules)  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
автор
А кто об этом пишет?


Ну, не знаю, м.б. мой русский на столько плох...

автор
Эти процедуры вызывают перекомпиляцию процедуры при следующем ее запуске,
а мне нужно было пересоздать объекты сейчас а не вызывать их все на выполнение.


Вот это вот, выделенное болдом, к чему относилось?!

автор
А мне совсем не нужно было выполнять все 20000 объектов чтобы их перекомпилить.
Пересоздание было нужно для обновления связей между объектами т.к. в dependencies - они не всегда актуальны.


Угу. Они и при пересоздании могут остаться неактуальными. Ибо чтобы все было актуально надо еще и порядок создания объектов соблюдать.
30 сен 09, 08:35    [7722912]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL - чудит(sys.sql_modules)  [new]
Jaffar
Member

Откуда:
Сообщений: 633
pkarklin
автор
А кто об этом пишет?

Вот это вот, выделенное болдом, к чему относилось?!


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

А вызывать на исполнение море объектов которые что-то делают в реальной базе - нах не нужно.
Вот о чем я пишу.

Пересоздание - это не drop/create - это alter.
при альтере связи актуализируются не все конечно.
так например если сделать алтер функции, то связь с процедурйо использующей ее исчезнет.
30 сен 09, 13:28    [7724491]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL - чудит(sys.sql_modules)  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
автор
К тому что если бы я использовал обозначенные вами процедуры то для того чтобы произошло пересоздание обьектов мне нужно было бы сначала выполнить одну из этих процедур, а потом вызвать свой объект на исполнение и только тогда произойдет долгожданная компиляция.


Смешались в кучу -кони, люди... ((с) Бородино). Кем долгожданная?!

автор
А мне совсем не нужно было выполнять все 20000 объектов чтобы их перекомпилить.
Пересоздание было нужно для обновления связей между объектами т.к. в dependencies - они не всегда актуальны.


Изменение в dependencies происходит в момент CREATE, ALTER, DROP, а не как Вам казалось в момент компиляции.

автор
А вызывать на исполнение море объектов которые что-то делают в реальной базе - нах не нужно.
Вот о чем я пишу.


Еще раз! Вам никто не предлагал вызывать их на выполнение, чтобы восстановить зависимости.

автор
при альтере связи актуализируются не все конечно.
так например если сделать алтер функции, то связь с процедурйо использующей ее исчезнет.


Да Вы что?!

USE tempdb
GO

CREATE FUNCTION fFoo(@par int) 
RETURNS int
AS
  BEGIN
    RETURN @par
  END
GO

CREATE PROC pFoo
AS
  SELECT TOP 100 dbo.fFoo(object_id) FROM sys.objects
GO

sp_depends 'dbo.fFoo'

GO

ALTER FUNCTION fFoo(@par int) 
RETURNS int
AS
  BEGIN
    RETURN @par + 1
  END
GO

sp_depends 'dbo.fFoo'

GO
DROP PROC pFoo
DROP FUNCTION fFoo
GO

name	type
dbo.pFoo stored procedure

name type
dbo.pFoo stored procedure
30 сен 09, 13:42    [7724595]     Ответить | Цитировать Сообщить модератору
 MSSQL - чудит(sys.sql_modules)  [new]
Jaffar
Member

Откуда:
Сообщений: 633
ну как вам сказать,
вы отчести правы, а отчасти нет
Я говорил про табличные функции, вот можете попробовать и убедиться.
так же видно что sp_recompile не пересоздает эту связь.

То что связи создаются и удаляются в в мометн alter, drop, create - это и так всем понятно.
просто я обозвал эти 3 действия одним словом "компиляция".

--- 1. создаем функцию
create function flex_Inline(@D datetime)
returns table as return(select top 10 * from tpd_Main m with(nolock) where m.DateDoc <= @D) 
go
--- 2.создаем процедуру использующую эту функцию
create procedure splex_Inline(@D datetime)
AS BEGIN declare @T numeric(16) select @T = max(ID) from flex_Inline(@D) END
Go

--- 3.смотрим связьи между ними
select *
from sys.sql_dependencies d with(nolock)
where	d.object_id = object_id('splex_Inline')
and		d.referenced_major_id = object_id('flex_Inline')
-- Вот что получилось:
-- 0	OBJECT_OR_COLUMN_REFERENCE_NON_SCHEMA_BOUND	1690604886	0	1674604829	1	1	0	0
-- т.е. связь есть 

--- 4.Пересоздаем функцию 
alter function flex_Inline(@D datetime)
returns table as return(select top 10 * from tpd_Main m with(nolock) where m.DateDoc <= @D) 
Go


--- 5.смотрим связьи между ними
select *
from sys.sql_dependencies d with(nolock)
where	d.object_id = object_id('splex_Inline')
and		d.referenced_major_id = object_id('flex_Inline')
-- Вот что получилось:
-- 	
-- т.е. связи нет


--- 6. выполняем ваш любимый sp_recompile
exec sp_recompile 'splex_Inline'

-- и проверяем появились ли связи после него
select *
from sys.sql_dependencies d with(nolock)
where	d.object_id = object_id('splex_Inline')
and		d.referenced_major_id = object_id('flex_Inline')
-- Вот что получилось:
-- 	
-- т.е. связи нет


-- 7.Теперь пересоздаем процедуру:
alter procedure splex_Inline(@D datetime)
AS BEGIN declare @T numeric(16) select @T = max(ID) from flex_Inline(@D) END
Go

--- 8.смотрим связьи между ними
select *
from sys.sql_dependencies d with(nolock)
where	d.object_id = object_id('splex_Inline')
and		d.referenced_major_id = object_id('flex_Inline')
-- Вот что получилось:
-- 0	OBJECT_OR_COLUMN_REFERENCE_NON_SCHEMA_BOUND	1690604886	0	1674604829	1	1	0	0
-- т.е. связь есть
1 окт 09, 09:19    [7727999]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL - чудит(sys.sql_modules)  [new]
Jaffar
Member

Откуда:
Сообщений: 633
я только не совсем понял что же делает процедура
sp_recompile
.
изменяет план выполнения или еще что?

[url=]http://msdn.microsoft.com/ru-ru/library/ms181647(SQL.90).aspx[/url]
1 окт 09, 09:25    [7728023]     Ответить | Цитировать Сообщить модератору
 Re: MSSQL - чудит(sys.sql_modules)  [new]
Glory
Member

Откуда:
Сообщений: 104760
Jaffar
я только не совсем понял что же делает процедура
sp_recompile
.
изменяет план выполнения или еще что?

[url=]http://msdn.microsoft.com/ru-ru/library/ms181647(SQL.90).aspx[/url]

Первое предложение из вашей ссылки

"Вызывает перекомпиляцию хранимых процедур и триггеров при следующем запуске."
1 окт 09, 10:35    [7728309]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить