SQL Server 2008 - sp_refreshview бомбардировка некоторых представлений - PullRequest
12 голосов
/ 24 июня 2011

Я унаследовал довольно существенный проект, который широко использует представления SQL Server (2005 и 2008).

Одним шагом в процессе сборки является вызов системной хранимой процедуры sp_refreshviews, чтобы убедиться, что никакие изменения в каких-либо таблицах не нарушают наши представления. Это отлично работает .... за исключением трех или четырех (из 200+) просмотров ....

С этими словами он просто взрывается - выдает странные сообщения об ошибках вроде

Сообщение 15165, уровень 16, состояние 1, Процедура sp_refreshsqlmodule_internal, строка 55
Не удалось найти объект 'vYourViewNameHere' или нет есть разрешение.

, что совершенно неправильно - это представление существует , и я определенно могу выбрать из него.

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

Обновление: Я зарегистрировал сообщение об ошибке в Microsoft Connect для этого - если вы согласны, что это кажется странным и требует исправления, пожалуйста, проголосуйте за него!

https://connect.microsoft.com/SQLServer/feedback/details/676728/sp-refreshview-crashes-with-misleading-error-on-views-with-schemabinding

Ответы [ 4 ]

15 голосов
/ 24 июня 2011

Я заметил в комментариях, которые вы упомянули, это имеет SCHEMABINDING. Я могу почти гарантировать, что это проблема. Электронные книги специально сказано, что это для использования в представлениях без привязки к схеме.

Представление, связанное со схемой, не допускает критических изменений, поэтому обновление метаданных не требуется. Вы можете спокойно пропустить это.

Вы можете идентифицировать все привязанные к схеме представления следующим образом:

SELECT * FROM sys.views WHERE OBJECTPROPERTY(object_id, 'IsSchemaBound')=1
5 голосов
/ 07 ноября 2012

Я столкнулся с той же ошибкой при использовании sp_helptext.В моем случае причиной было использование sp_rename для переименования представления.Следующий код воспроизводит эту ошибку.

create view demo as select dummy = 1
go

exec sp_rename 'demo', 'new_demo'
go

exec sp_refreshview 'new_demo'
go

Единственное решение - вручную изменить вид.Примените это исправление к вышеуказанному решению, и вы получите:

create view demo as select dummy = 1
go

exec sp_rename 'demo', 'new_demo'
go

-- This statement fixes the problem
alter view new_demo as select dummy = 1
go

exec sp_refreshview 'new_demo'
go
0 голосов
/ 27 августа 2013

Чтобы определить, какое представление является вашей проблемой, добавьте печать в обычные sppRefreshViews.Ничто не разрушает землю здесь, но я думал, что поделюсь.

CREATE procedure sppRefreshViews2

    as
    declare @t varchar (1024)

    declare tbl_cur cursor for
    select TABLE_NAME from INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'VIEW' and table_name like 'sp%'
    OPEN tbl_cur

    FETCH NEXT from tbl_cur INTO @t
    WHILE @@FETCH_STATUS = 0
    BEGIN
    print      @t 
    exec ('sp_refreshview ''' + @t + '''')
    FETCH NEXT from tbl_cur INTO @t
    END

    CLOSE tbl_cur
    DEALLOCATE tbl_Cur
0 голосов
/ 25 июня 2012

Мое воплощение этой ошибки было:

Сообщение 8116, уровень 16, состояние 1, процедура sp_refreshsqlmodule_internal, Строка 75 Аргумент типа данных int недопустим для аргумента 1 подстроки функция.

Это сообщение об ошибке сообщалось в различных местах сценария db. Я бы сказал неправильные места. Если бы я закомментировал SQL, в котором сообщалось об этой ошибке, такая же ошибка была бы сообщена в другом месте.

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

-- EXECUTE sp_refreshview @viewName;

Примечание: Моя база данных не сообщила о наличии привязок к схеме при выполнении запроса, предложенного в смежном ответе RThomas https://stackoverflow.com/a/6460532/179972

ОБНОВЛЕНИЕ - РЕШЕНИЕ:

После успешного выполнения нашего сценария базы данных с закомментированной командой sp_refreshview (показанной выше) мы затем запустили код обновления представления самостоятельно, и он также был успешным.

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

...