Невозможно создать сценарий для 3 представлений в SQL Server Management Studio 2008 - PullRequest
0 голосов
/ 23 ноября 2011

У меня странная проблема

Когда я создаю объектный скрипт (скрипт для удаления и создания хранимых процедур, представлений, функций) из Sql Server 2008, он пропускает 3 представления, не знаю почему?

Я выполняю следующие шаги для создания сценария объекта

1) Откройте Sql Server 2008 Management Studio 2) Подключитесь к серверу 3) Щелкните правой кнопкой мыши на выбранной базе данных, затем выберите Задачи -> Создать сценарий, затем выберите базу данных изсписок, нажмите кнопку Далее.4) Это дает опции, которые я изменяю три опции: Включить, если не существует = true, Script Drop = true, Script Use Database = false и нажимать кнопку Next 4) Теперь выбираем SP, Views и Functions и нажимаем Next, 5) нажимаем Select Allдля всех следующих экранов 6) Наконец, нажмите кнопку «Готово».

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

Пожалуйста, дайтеЯ знаю, что если я что-то упустил, я пробовал много способов.

Я также обнаружил, что эта проблема существует не только с представлениями, но также существует с функциями и хранимыми процедурами.

Если мы переименуемони работают нормально, например, функция, ранее названная dbo.SeperateElementsInt, работала нормально, но, как ни странно, Generate Script игнорировал эту функцию, позже мы переименовали ее в dbo.SeperateElementsInteger, и она начала генерировать скрипт.

Мы не можем изменитьПросмотр имен, как он используется во многих местах.

Представления, вызывающие проблему, - это dbo.DivisionInfo и dbo.CustomerDivisonOfficeInfo Хранимая процедура, вызывающая проблему, - dbo.procsync_get_zVariable

Проблема существует и в SSMS 2005.

Спасибо

Ответы [ 2 ]

0 голосов
/ 18 июня 2015

Я просто столкнулся с точной проблемой.Мы пытались написать схему одной базы данных (назовите ее Database_A), и многие просмотры не были бы выполнены.

Мы списали другую базу данных (назовите ее Database_B), и все представления, которые не будут обрабатываться сценарием (в Database_A), указали на эту базу данных (Database_B), к которой обращались через связанный сервер, и она была недоступна,Поскольку все строки подключения теперь указывали на новый сервер, на котором сейчас была база данных Database_A, я перевел Database_A на старом сервере в режим read_only на достаточно долго, чтобы составить сценарий представлений, и это сработало.Снова отключил базу данных, и мы получили то, что нам было нужно.

Сценарий, который я создал вместе, чтобы найти ссылку на связанный сервер в представлениях, был следующим:

    use Database_B
    go

    select so.name, sc.text 
    from sysobjects so, syscomments sc
    where so.id = sc.id
    and sc.text like '%Database_A%'

Это то, что работало для меня, я надеюсь, что оно работает и для вас.

Береги себя,

Том

0 голосов
/ 24 ноября 2011

Мы не поняли друг друга в вопросе INFORMATION_SCHEMA-profiler.Я предлагал включить профилировщик, потому что SSMS выполняет SELECT для INFORMATION_SCHEMA с некоторыми предложениями where.Я подозреваю, что сам запрос отсекает ваши взгляды.Как только у вас появится запрос, который SSMS выполняет для получения списка объектов, вы должны выяснить, почему он не видит некоторые представления.

Вот сценарии, которые SSMS выполняет, когда вы выбираете все представления и запускаете сценарии.Проверьте, не возвращает ли какой-либо из них представление DivisionInfo.(Я создал представление DivisionInfo в моей базе данных, чтобы воспроизвести ваш случай).Для быстрой проверки выполните их один за другим и читайте мои комментарии после каждого запроса. Обратите внимание, что на самом деле вы должны перехватывать запросы в вашей среде с помощью Profiler, поскольку они могут отличаться в вашей среде.

Перед отображением экрана выбора видов, процедур, ... SSMS выполняет следующий скриптчтобы получить список просмотров:

exec sp_executesql N'SELECT
''Server[@Name='' + quotename(CAST(
        serverproperty(N''Servername'')
       AS sysname),'''''''') + '']'' + ''/Database[@Name='' + quotename(db_name(),'''''''') + '']'' + ''/View[@Name='' + quotename(v.name,'''''''') + '' and @Schema='' + quotename(SCHEMA_NAME(v.schema_id),'''''''') + '']'' AS [Urn],
v.name AS [Name],
SCHEMA_NAME(v.schema_id) AS [Schema]
FROM
sys.all_views AS v
WHERE
(v.type = @_msparam_0)and(CAST(
 case 
    when v.is_ms_shipped = 1 then 1
    when (
        select 
            major_id 
        from 
            sys.extended_properties 
        where 
            major_id = v.object_id and 
            minor_id = 0 and 
            class = 1 and 
            name = N''microsoft_database_tools_support'') 
        is not null then 1
    else 0
end          
             AS bit)=0)
ORDER BY
[Schema] ASC,[Name] ASC',N'@_msparam_0 nvarchar(4000)',@_msparam_0=N'V'

Ваш вид в списке?Вы можете добавить условие WHERE v.name = 'DivisionInfo', чтобы отфильтровать его.Если в списке нет DivisionInfo, проверьте, какая часть этого запроса исключает его из набора результатов.

После выбора объектов для сценария и запуска сценариев SSMS создает временную таблицу, хранит в ней объекты и выполняет сценарии для поиска связанных объектов..

Создать временную таблицу и вставить в нее представление DivisionInfo:

CREATE TABLE #tempdep (objid int NOT NULL, имя_объекта sysname NOT NULL, имя_объекта sysname NULL, имя_объекта sysname NOT NULL, объектный тип smallint NOTNULL)

exec sp_executesql N'INSERT INTO #tempdep 

SELECT
v.object_id AS [ID],
v.name AS [Name],
SCHEMA_NAME(v.schema_id) AS [Schema],
db_name(),
2
FROM
sys.all_views AS v
WHERE
(v.type = @_msparam_0)and(v.name=@_msparam_1 and SCHEMA_NAME(v.schema_id)=@_msparam_2)',N'@_msparam_0 nvarchar(4000),@_msparam_1 nvarchar(4000),@_msparam_2 nvarchar(4000)',@_msparam_0=N'V',@_msparam_1=N'DivisionInfo',@_msparam_2=N'dbo'

Вставил ли этот запрос что-нибудь в #tempdep?Если нет, проверьте почему. Еще раз: вам нужно использовать Profiler для получения запросов из вашей среды, а не использовать запросы, которые я здесь размещаю, потому что они из моей среды.

Когда вы начинаете профилирование, должно быть много вставоккак тот, что выше.Вам нужно найти тот, который относится к DivisionInfo.Вы можете использовать опцию Find, чтобы найти его, потому что вы увидите много запросов в Profiler, потому что у вас есть много других просмотров.Чтобы сделать журнал профилировщика меньшим, нужно только просмотреть сценарии.

Как видите, идея состоит в том, чтобы начать профилирование и запустить сценарии.После завершения сценариев остановите профилировщик и проверьте сценарии, выполняемые SSMS.Вы должны выяснить, почему он не видит DivisionInfo.Если в журнале профилировщика нет DivisionInfo, но вы можете проверить его на наличие сценариев в мастере, тогда возьмите сценарии для DivisionInfo и для одного представления, для которого работает сценарий, и просмотрите различия между ними.Внимательно рассмотрите различия между ними в отношении сценариев, которые SMSS использует для их извлечения.

  • по какой-то причине SSMS отклоняет это представление
  • в соответствии с данными, извлеченными с помощью запросов (catchedот профилировщика)
...