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

Откуда: юг
Сообщений: 10
CREATE TABLE [aaa] (
[f] [char] (10) NULL)
go
CREATE VIEW dbo.vaaa
AS SELECT * FROM dbo.aaa
go

select * from vaaa
print 'my message'


(0 row(s) affected)

my message

drop table aaa
go
select * from vaaa
print 'my message'


Server: Msg 208, Level 16, State 1, Procedure vaaa, Line 3
Invalid object name 'dbo.aaa'.
Server: Msg 4413, Level 16, State 1, Line 1
Could not use view or function 'vaaa' because of binding errors.


впрочем того же результата можно добиться просто селектом из несуществующего источника типа select * from bla-bla-bla

я почему привёл пример с вьюхой...
есть у меня скриптик который джобом ночью ребилдит индексы, перекомпилит процедуры и т.д.
вот дописал туда ещё sp_refreshview
и всё было красиво пока у вьюхи не "забрали" табличку ;-)
и на этом этапе батч стал с такой же ошибкой

проблема не в старой вьюхе а в том КАК ЖЕ БОРОТЬСЯ С ТАКИМИ ОШИБКАМИ?

как при возникновении таких ошибок заставить батч выполняться дальше?
3 май 03, 18:59    [189514]     Ответить | Цитировать Сообщить модератору
 Re: Что делать с такими ошибками?  [new]
Ziv
Member

Откуда:
Сообщений: 10
Попробуй перед запуском скрипта проверять на наличие объекта в базе. Например:
if exists (select * from sysobjects where id = object_id(N'[dbo].[Table]')
and OBJECTPROPERTY(id, N'IsUserTable') = 1) select * from Table
3 май 03, 19:26    [189516]     Ответить | Цитировать Сообщить модератору
 Re: Что делать с такими ошибками?  [new]
V. Motchulsky
Guest
Зачем изобретать "велосипед" - стандартный Maintenance plan все это делает. И процедуры сервер время от времени сам перекомпилирует.
3 май 03, 21:25    [189528]     Ответить | Цитировать Сообщить модератору
 Re: Что делать с такими ошибками?  [new]
Glory
Member

Откуда:
Сообщений: 104760
как при возникновении таких ошибок заставить батч выполняться дальше?

Никак. Нужно перехватывать ошибку на клиенте.

И создавать представления с опцией WITH SCHEMABINDING, которая запретит удаление(изменение) таблиц (и не только) без предварительного изменения представления.
3 май 03, 21:58    [189537]     Ответить | Цитировать Сообщить модератору
 Re: Что делать с такими ошибками?  [new]
VVarrior
Member

Откуда: юг
Сообщений: 10
2ALL:речь идёт об обработке ошибок и ни о чём другом
2Ziv:
и что проверять прикажете? если у вьюхи грохнули таблицу?
баз на сервере штух ....дцать, в каждой ~e3 таблиц и столько же вьюх и процедур...
2V. Motchulsky:maintaince plan делает...но только в этом форуме куча постов про проблемы с планом....и про процедуры и вьюхи в плане ничего нет ;-))
И процедуры сервер время от времени сам перекомпилирует.
ну да....и статистику обновляет....и вообще посты в этом форуме только о том какой хороший mssql ;-))
2Glory:
про опцию спасибо....только не я писал задачу....
и про какого клиента речь? вот я в qa запускаю батч а он мне на середине выполнения становится с такой или похожей ошибкой...мне плевать что какой то одной таблице из десятков тысяч не перестроится индекс или не поставится флажок перекомпиляции для процедуры или.....и т.д.....мне надо чтоб батч работал дальше.....
ну не переносить же это на клиента в самом деле!


плиз подскажите как пусть не побороть а обойти это?
4 май 03, 11:24    [189614]     Ответить | Цитировать Сообщить модератору
 Re: Что делать с такими ошибками?  [new]
неважно кто
Guest
exec('sp_refreshview ...')
4 май 03, 11:31    [189616]     Ответить | Цитировать Сообщить модератору
 Re: Что делать с такими ошибками?  [new]
VVarrior
Member

Откуда: юг
Сообщений: 10
неважно кто написал неважно что
вы хоть ветку прочли?...она ведь короткая....
4 май 03, 11:46    [189619]     Ответить | Цитировать Сообщить модератору
 Re: Что делать с такими ошибками?  [new]
неважно кто
Guest
В следующий раз советую сказать спасибо.

CREATE TABLE [aaa] ( 

[f] [char] (10) NULL)
go
CREATE VIEW dbo.vaaa
AS SELECT * FROM dbo.aaa
go

select * from vaaa
print 'my message'
go
drop table aaa
go
exec('select * from vaaa')
print '!!!!!!!!!!! my message !!!!!!!!!!!!!!!!!!'
4 май 03, 12:35    [189628]     Ответить | Цитировать Сообщить модератору
 Re: Что делать с такими ошибками?  [new]
VVarrior
Member

Откуда: юг
Сообщений: 10
exec('select * from vaaa')
print '!!!!!!!!!!! my message !!!!!!!!!!!!!!!!!!'
exec('sp_refreshview vaaa')
print '!!!!!!!!!!! my message !!!!!!!!!!!!!!!!!!'



Server: Msg 208, Level 16, State 1, Procedure vaaa, Line 2
Invalid object name 'dbo.aaa'.
Server: Msg 4413, Level 16, State 1, Line 1
Could not use view or function 'vaaa' because of binding errors.
!!!!!!!!!!! my message !!!!!!!!!!!!!!!!!!
Server: Msg 208, Level 16, State 1, Procedure vaaa, Line 2
Invalid object name 'dbo.aaa'.
Server: Msg 4413, Level 16, State 1, Line 2
Could not use view or function 'vaaa' because of binding errors.
4 май 03, 12:50    [189633]     Ответить | Цитировать Сообщить модератору
 Re: Что делать с такими ошибками?  [new]
неважно кто
Guest
Да, с extended sp засада полная. :(

Если извращаться до последнего, то можно так:

CREATE TABLE [aaa] ( 

[f] [char] (10) NULL)
go
CREATE VIEW dbo.vaaa
AS SELECT * FROM dbo.aaa
go
drop table aaa
go
exec master..xp_cmdshell 'osql -S<servername> -d<dbname> -E -Q"sp_refreshview vaaa"'
print '!!!!!!!!!!! my message !!!!!!!!!!!!!!!!!!'
GO
drop view vaaa
4 май 03, 13:36    [189644]     Ответить | Цитировать Сообщить модератору
 Re: Что делать с такими ошибками?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ну для представлений можно просто попытаться сделать к нему запрос. И обработать ошибку, если она возникнет

CREATE TABLE [taaa] ( [f] [char] (10) NULL) 

go
CREATE VIEW dbo.vaaa AS SELECT * FROM dbo.taaa
go
drop table taaa
go
declare @mysql varchar(8000)
set @mysql = 'select top 1 * from vaaa'
exec(@mysql)
IF @@error = 0 exec sp_refreshview 'vaaa'

print '!!!!!!!!!!! my message !!!!!!!!!!!!!!!!!!'
GO
drop view vaaa
4 май 03, 17:18    [189693]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить