Где хранятся представления, хранящиеся в SQL Server

Я новичок в SQL Server. Я пробовал работать в Интернете некоторое время, но не мог ответить на мой вопрос. Может кто-нибудь скажет мне, где именно находится представление, хранящееся в базе данных SQL Server 2008?

7

5 ответы

The pedantic answer to your question is... only Microsoft knows exactly where view metadata is physically stored. In the move from SQL 2000 to SQL 2005 (on which 2008 is based) MS got rid of direct access to system tables where views used to be literally stored (dbo.sysviews and dbo.syscomments) and added a layer of abstraction (via the hidden resources database) which means you can only access meta data about views via catalog views. INFORMATION_SCHEMA is an ANSI compliant set of catalog views. While marginally useful for their relative portability between versions, often more information is available from the sql 2008 catalog views - in this case sys.views and sys.sql_modules

Имейте в виду, что представления могут быть созданы с помощью опции ENCRYPTION, которая шифрует записи (ы) sys.comments, которые содержат определение SQL представления. Но если он не зашифрован, то sp_helptext [MyView] даст вам быстрый взгляд на определение.

отредактированный в соответствии с 1-м комментарием ниже, заменить «sys.comments» на «sys.sql_modules»

5
добавлено
Сначала sys.syscomments , а не sys.comments . Во-вторых, sys.syscomments - это устаревшее представление.
добавлено автор Bogdan Sahlean, источник
Мой плохой, я должен был проверить BOL перед записью из памяти. Я соответствующим образом отредактировал это.
добавлено автор eidgenossen, источник

Note: Based on this post http://improve.dk/archive/2012/08/27/where-does-sql-server-store-the-source-for-stored-procedures.aspx, is very likely that the definition of views are stored (also) in sys.sysobjvalues system table.

Список всех пользовательских T-SQL модулей (в SQL Server 2008) можно запросить с помощью системного представления sys.sql_modules ( ссылка ). Здесь вы можете найти определения пользовательских представлений (определение столбца ):

SELECT  QUOTENAME(s.name)+'.'+QUOTENAME(o.name) AS full_object_name, 
        m.*
FROM    sys.sql_modules m
JOIN    sys.objects o ON m.object_id=o.object_id
JOIN    sys.schemas s ON o.schema_id=s.schema_id
WHERE   o.type='V' -- only view objects
ORDER BY full_object_name

Если вы запустите EXEC sp_helptext 'sys.sql_modules' , вы получите исходный код этого системного представления:

CREATE VIEW sys.sql_modules AS
    SELECT object_id = o.id,
        definition = object_definition(o.id),
        uses_ansi_nulls = sysconv(bit, o.status & 0x40000),             -- OBJMOD_ANSINULLS
        uses_quoted_identifier = sysconv(bit, o.status & 0x80000),      -- OBJMOD_QUOTEDIDENT
        is_schema_bound = sysconv(bit, o.status & 0x20000),             -- OBJMOD_SCHEMABOUND
        uses_database_collation = sysconv(bit, o.status & 0x100000),    -- OBJMOD_USESDBCOLL
        is_recompiled = sysconv(bit, o.status & 0x400000),              -- OBJMOD_NOCACHE
        null_on_null_input = sysconv(bit, o.status & 0x200000),         -- OBJMOD_NULLONNULL
        execute_as_principal_id = x.indepid
    FROM sys.sysschobjs o
    LEFT JOIN sys.syssingleobjrefs x ON x.depid = o.id AND x.class = 22 AND x.depsubid = 0 -- SRC_OBJEXECASOWNER
    WHERE o.pclass <> 100
        AND ((o.type = 'TR' AND has_access('TR', o.id, o.pid, o.nsclass) = 1)
            OR (type IN ('P','V','FN','IF','TF','RF','IS') AND has_access('CO', o.id) = 1)
            OR (type IN ('R','D') AND o.pid = 0))

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

Примечание 1: Использование INFORMATION_SCHEMA.VIEWS для определения определения не является надежным методом, поскольку определение столбца INFORMATION_SCHEMA.VIEWS.VIEW_DEFINITION convert (nvarchar (4000) , object_definition (object_id)) (максимум 4000 символов).

Примечание 2: Вместо этого вы должны использовать столбец sys.sql_modules.definition : definition = object_definition (o.id) . Если вы посмотрите на функцию object_definition ( ссылка ) вы увидите, что тип возврата nvarchar (max) .

3
добавлено

В системной таблице.

Следующий запрос будет их извлекать ...

SELECT TABLE_NAME как ViewName, VIEW_DEFINITION как ViewDefinition FROM INFORMATION_SCHEMA.Views

Для просмотра их редактирования вы обычно смотрите в папке просмотра под таблицами в диспетчере студий.

Вы можете создавать/редактировать их из этой папки с помощью сценариев дизайнера или записи.

1
добавлено

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

Механизмы БД могут хранить «материализованные» взгляды, но это другая тема.

0
добавлено
Он хранится так же постоянно, как и все, что есть в вашей базе данных, то есть вы можете его явно удалить, если хотите.
добавлено автор cms_mgr, источник
В той же базе данных находятся представления. В таблице, указанной в моем ответе.
добавлено автор Dan, источник
Я знаю об этом, но когда создается представление, некоторые метаданные, относящиеся к представлению, должны быть созданы правильно? Я хочу знать, где сохранены эти метаданные? Temp DB, Master DB, Resource DB или временное/постоянное хранилище ... Любые идеи?
добавлено автор Sparky, источник
Является ли определение вида сохраненным постоянно или временно?
добавлено автор Sparky, источник

View - это простой оператор SQL, который хранится в схеме базы данных (INFORMATION_SCHEMA.Views). Поэтому, когда мы вызываем представление, оператор SQL запускается и возвращает строки из основной физической таблицы.

Вы также можете указать представление как логическую таблицу, в которой хранится defination (оператор sql), но не результат.

Вы можете увидеть дефиницию, используя приведенную ниже инструкцию, как сказал Дэн выше, Только если дефиниция представления не зашифрована: SELECT TABLE_NAME как ViewName, VIEW_DEFINITION как ViewDefinition FROM INFORMATION_SCHEMA.Views

Подробнее о View @ MSDN .

0
добавлено
VIEW_DEFINITION ограничен только 4000 символами [n].
добавлено автор Bogdan Sahlean, источник
Да, верно. Я не знаю, как добавить комментарий к ответу eidgenossen, но sys.views сохраняет только имя объекта (см. Здесь), а sys.com - устаревшее. SP_helptext ViewName используется только тогда, когда мы знаем имя представления. Также мы не можем видеть зашифрованные представления.
добавлено автор Prabhat, источник
SqlCom.ru - Стиль жизни SQL
SqlCom.ru - Стиль жизни SQL
908 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только MS SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz). Предложения в @sql_ninja

SQL_Ninja
SQL_Ninja
340 участник(ов)

Правила чата - https://t.me/sqlcom/88269 @sqlcom - основной канал (только SQL) @sql_ninja - второй канал (SQL вопросы начального уровня и свободное общение) @Gopnegbot - Викторина по SQL Server (наберите в привате /quiz)