CREATE VIEW (Transact-SQL)CREATE VIEW (Transact-SQL)

ОБЛАСТЬ ПРИМЕНЕНИЯ:даSQL Server (начиная с 2008)даБаза данных SQL AzureдаХранилище данных SQL AzureдаParallel Data WarehouseAPPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Создает виртуальную таблицу, содержимое которой (столбцы и строки) определяется запросом.Creates a virtual table whose contents (columns and rows) are defined by a query. Используйте эту инструкцию для создания представления данных, содержащихся в одной или более таблицах базы данных.Use this statement to create a view of the data in one or more tables in the database. Например, представление можно использовать в следующих целях.For example, a view can be used for the following purposes:

  • Для направления, упрощения и настройки восприятия информации в базе данных каждым пользователем.To focus, simplify, and customize the perception each user has of the database.

  • В качестве механизма безопасности, позволяющего пользователям обращаться к данным через представления, но не предоставляя им разрешений на непосредственный доступ к базовым таблицам.As a security mechanism by allowing users to access data through the view, without granting the users permissions to directly access the underlying base tables.

  • Для предоставления интерфейса обратной совместимости, моделирующего таблицу, схема которой изменилась.To provide a backward compatible interface to emulate a table whose schema has changed.

    Значок ссылки на раздел Синтаксические обозначения в Transact-SQLTopic link icon Transact-SQL Syntax Conventions

СинтаксисSyntax

-- Syntax for SQL Server and Azure SQL Database  

CREATE [ OR ALTER ] VIEW [ schema_name . ] view_name [ (column [ ,...n ] ) ]   
[ WITH <view_attribute> [ ,...n ] ]   
AS select_statement   
[ WITH CHECK OPTION ]   
[ ; ]  

<view_attribute> ::=   
{  
    [ ENCRYPTION ]  
    [ SCHEMABINDING ]  
    [ VIEW_METADATA ]       
}   
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse  

CREATE VIEW [ schema_name . ] view_name [  ( column_name [ ,...n ] ) ]   
AS <select_statement>   
[;]  

<select_statement> ::=  
    [ WITH <common_table_expression> [ ,...n ] ]  
    SELECT <select_criteria>  

АргументыArguments

OR ALTEROR ALTER
Применимо к: База данных SQL AzureAzure SQL Database и SQL ServerSQL Server (начиная с SQL Server 2016 (13.x)SQL Server 2016 (13.x) с пакетом обновления 1 (SP1)).Applies to: База данных SQL AzureAzure SQL Database and SQL ServerSQL Server (starting with SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1).

Условно изменяет представление только в том случае, если оно уже существует.Conditionally alters the view only if it already exists.

schema_nameschema_name
Имя схемы, которой принадлежит представление.Is the name of the schema to which the view belongs.

view_nameview_name
Имя представления.Is the name of the view. Имена представлений должны соответствовать требованиям, предъявляемым к идентификаторам.View names must follow the rules for identifiers. Указывать имя владельца представления не обязательно.Specifying the view owner name is optional.

columncolumn
Имя, которое будет иметь столбец в представлении.Is the name to be used for a column in a view. Имя столбца требуется только в тех случаях, когда столбец формируется на основе арифметического выражения, функции или константы, если два или более столбцов могут по иной причине получить одинаковые имена (как правило, в результате соединения) или если столбцу представления назначается имя, отличное от имени столбца, от которого он произведен.A column name is required only when a column is derived from an arithmetic expression, a function, or a constant; when two or more columns may otherwise have the same name, typically because of a join; or when a column in a view is specified a name different from that of the column from which it is derived. Назначать столбцам имена можно также в инструкции SELECT.Column names can also be assigned in the SELECT statement.

Если аргумент column не указан, столбцам представления назначаются такие же имена, которые имеют столбцы в инструкции SELECT.If column is not specified, the view columns acquire the same names as the columns in the SELECT statement.

Примечание

В столбцах представления разрешения для имени столбца применяются с инструкцией CREATE VIEW или ALTER VIEW вне зависимости от источника базовых данных.In the columns for the view, the permissions for a column name apply across a CREATE VIEW or ALTER VIEW statement, regardless of the source of the underlying data. Например, если в инструкции CREATE VIEW были заданы разрешения для столбца SalesOrderID, инструкция ALTER VIEW может переименовать столбец SalesOrderID, например в OrderRef, и все же иметь разрешения, связанные с представлением, в котором используется столбец SalesOrderID.For example, if permissions are granted on the SalesOrderID column in a CREATE VIEW statement, an ALTER VIEW statement can name the SalesOrderID column with a different column name, such as OrderRef, and still have the permissions associated with the view using SalesOrderID.

ASAS
Определяет действия, которые должны быть выполнены в представлении.Specifies the actions the view is to perform.

select_statementselect_statement
Инструкция SELECT, которая определяет представление.Is the SELECT statement that defines the view. В этой инструкции можно указывать более одной таблицы и другие представления.The statement can use more than one table and other views. Для выбора объектов, указанных в предложении SELECT создаваемого представления, необходимы соответствующие разрешения.Appropriate permissions are required to select from the objects referenced in the SELECT clause of the view that is created.

Представление не обязательно является простым подмножеством строк и столбцов одной конкретной таблицы.A view does not have to be a simple subset of the rows and columns of one particular table. С помощью предложения SELECT можно создавать представление, использующее более одной таблицы, или другие представления любой степени сложности.A view can be created that uses more than one table or other views with a SELECT clause of any complexity.

При использовании в определении индексированного представления инструкция SELECT должна содержать указание одной таблицы или соединять инструкцией JOIN несколько таблиц с необязательной статистической обработкой.In an indexed view definition, the SELECT statement must be a single table statement or a multitable JOIN with optional aggregation.

Предложения SELECT, используемые в определении представления, не могут включать следующие элементы:The SELECT clauses in a view definition cannot include the following:

  • предложение ORDER BY, если только в списке выбора инструкции SELECT нет также предложения TOP;An ORDER BY clause, unless there is also a TOP clause in the select list of the SELECT statement

    Важно!

    Предложение ORDER BY используется исключительно для определения строк, возвращаемых предложениями TOP или OFFSET в определении представления.The ORDER BY clause is used only to determine the rows that are returned by the TOP or OFFSET clause in the view definition. Предложение ORDER BY не гарантирует упорядочивания результатов при запросе к представлению, если оно не указано в самом запросе.The ORDER BY clause does not guarantee ordered results when the view is queried, unless ORDER BY is also specified in the query itself.

  • ключевое слово INTO;The INTO keyword

  • предложение OPTION;The OPTION clause

  • ссылку на временную таблицу или табличную переменную.A reference to a temporary table or a table variable.

    Так как аргумент select_statement использует инструкцию SELECT, допустимо включать в состав предложения FROM указания <join_hint> и <table_hint>.Because select_statement uses the SELECT statement, it is valid to use <join_hint> and <table_hint> hints as specified in the FROM clause. Дополнительные сведения см. в разделе FROM (Transact-SQL) и SELECT (Transact-SQL).For more information, see FROM (Transact-SQL) and SELECT (Transact-SQL).

    В аргументе select_statement можно использовать функции и множественные инструкции SELECT, разделенные оператором UNION или UNION ALL.Functions and multiple SELECT statements separated by UNION or UNION ALL can be used in select_statement.

    CHECK OPTIONCHECK OPTION
    Обеспечивает соответствие всех выполняемых для представления инструкций, изменяющих данные, критериям, заданным в выражении select_statement.Forces all data modification statements executed against the view to follow the criteria set within select_statement. Если строка изменяется посредством представления, предложение WITH CHECK OPTION гарантирует, что после фиксации изменений доступ к данным из представления сохранится.When a row is modified through a view, the WITH CHECK OPTION makes sure the data remains visible through the view after the modification is committed.

Примечание

Любые обновления, произведенные непосредственно в базовых таблицах представления, не проверяются в контексте представления — даже в том случае, если указано предложение CHECK OPTION.Any updates performed directly to a view's underlying tables are not verified against the view, even if CHECK OPTION is specified.

ENCRYPTIONENCRYPTION
Применимо к: с SQL Server 2008SQL Server 2008 до SQL Server 2017SQL Server 2017 и База данных SQL AzureAzure SQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and База данных SQL AzureAzure SQL Database.

Выполняет шифрование элементов представления sys.syscomments, содержащих текст инструкции CREATE VIEW.Encrypts the entries in sys.syscomments that contain the text of the CREATE VIEW statement. Использование предложения WITH ENCRYPTION предотвращает публикацию представления в рамках репликации SQL Server.Using WITH ENCRYPTION prevents the view from being published as part of SQL Server replication.

SCHEMABINDINGSCHEMABINDING
Привязывает представление к схеме базовой таблицы или таблиц.Binds the view to the schema of the underlying table or tables. Если аргумент SCHEMABINDING указан, нельзя изменить базовую таблицу или таблицы таким способом, который может повлиять на определение представления.When SCHEMABINDING is specified, the base table or tables cannot be modified in a way that would affect the view definition. Сначала нужно изменить или удалить само представление для сброса зависимостей от таблицы, которую требуется изменить.The view definition itself must first be modified or dropped to remove dependencies on the table that is to be modified. При использовании аргумента SCHEMABINDING инструкция select_statement должна включать двухкомпонентные (schema.object) имена таблиц, представлений или пользовательских функций, упоминаемых в предложении.When you use SCHEMABINDING, the select_statement must include the two-part names (schema.object) of tables, views, or user-defined functions that are referenced. Все указанные в инструкции объекты должны находиться в одной базе данных.All referenced objects must be in the same database.

Представления или таблицы, входящие в представление, созданное при помощи предложения SCHEMABINDING, не могут быть сброшены, пока это представление не будет удалено или изменено таким образом, чтобы оно более не было привязано к схеме.Views or tables that participate in a view created with the SCHEMABINDING clause cannot be dropped unless that view is dropped or changed so that it no longer has schema binding. В противном случае компонент Компонент Database EngineDatabase Engine выдаст ошибку.Otherwise, the Компонент Database EngineDatabase Engine raises an error. Кроме того, выполнение инструкций ALTER TABLE для таблиц, которые входят в представления, привязанные к схемам, завершается ошибкой, если эти инструкции влияют на определение представления.Also, executing ALTER TABLE statements on tables that participate in views that have schema binding fail when these statements affect the view definition.

VIEW_METADATAVIEW_METADATA
Указывает, что экземпляр SQL ServerSQL Server возвратит в API-интерфейсы DB-Library, ODBC и OLE DB сведения метаданных о представлении вместо базовой таблицы или таблиц, когда метаданные режима обзора затребованы для запроса, который ссылается на представление.Specifies that the instance of SQL ServerSQL Server will return to the DB-Library, ODBC, and OLE DB APIs the metadata information about the view, instead of the base table or tables, when browse-mode metadata is being requested for a query that references the view. Метаданные режима обзора — это дополнительные метаданные, которые экземпляр SQL ServerSQL Server возвращает вышеназванным клиентским API-интерфейсам.Browse-mode metadata is additional metadata that the instance of SQL ServerSQL Server returns to these client-side APIs. Эти метаданные позволяют клиентским API-интерфейсам реализовывать обновляемые клиентские курсоры.This metadata enables the client-side APIs to implement updatable client-side cursors. Метаданные режима обзора содержат сведения о базовой таблице, которой принадлежат столбцы в результирующем наборе.Browse-mode metadata includes information about the base table that the columns in the result set belong to.

Для представлений, созданных с применением предложения VIEW_METADATA, метаданные режима обзора возвращают имя представления, а не имена базовых таблиц при описании столбцов из представления в результирующем наборе.For views created with VIEW_METADATA, the browse-mode metadata returns the view name and not the base table names when it describes columns from the view in the result set.

В представлении, созданном с предложением WITH VIEW_METADATA, все столбцы, за исключением столбца timestamp, поддерживают обновление, если представление включает триггеры INSTEAD OF INSERT или INSTEAD OF UPDATE.When a view is created by using WITH VIEW_METADATA, all its columns, except a timestamp column, are updatable if the view has INSTEAD OF INSERT or INSTEAD OF UPDATE triggers. Дополнительные сведения об обновляемых представлениях см. в разделе «Примечания».For more information about updatable views, see Remarks.

RemarksRemarks

Представление может быть создано только в текущей базе данных.A view can be created only in the current database. Инструкция CREATE VIEW должна быть первой в пакетном запросе.The CREATE VIEW must be the first statement in a query batch. Представление может включать не более 1 024 столбцов.A view can have a maximum of 1,024 columns.

При выполнении запросов через представление компонент Компонент Database EngineDatabase Engine проверяет, существуют ли все указанные в инструкции объекты базы данных, верны ли они в контексте инструкции и соответствуют ли инструкции модификации данных правилам обеспечения целостности данных.When querying through a view, the Компонент Database EngineDatabase Engine checks to make sure that all the database objects referenced anywhere in the statement exist and that they are valid in the context of the statement, and that data modification statements do not violate any data integrity rules. Если проверка завершается ошибкой, возвращается сообщение об ошибке.A check that fails returns an error message. При успешной проверке операция преобразуется в операцию над базовой таблицей или таблицами.A successful check translates the action into an action against the underlying table or tables.

Если представление зависит от удаленной таблицы или представления, компонент Компонент Database EngineDatabase Engine в ответ на попытку использования представления возвращает сообщение об ошибке.If a view depends on a table or view that was dropped, the Компонент Database EngineDatabase Engine produces an error message when anyone tries to use the view. Если создана новая таблица или представление, а структура таблицы не изменилась по сравнению с предыдущей базовой таблицей для замены удаленной, то представление можно использовать снова.If a new table or view is created and the table structure does not change from the previous base table to replace the one dropped, the view again becomes usable. Если структура новой таблицы или представления отличается от предыдущей, представление нужно удалить и создать заново.If the new table or view structure changes, the view must be dropped and re-created.

Если представление создано без применения предложения SCHEMABINDING, то при изменении объектов, влияющих на определение представления, необходимо выполнять хранимую процедуру sp_refreshview.If a view is not created with the SCHEMABINDING clause, sp_refreshview should be run when changes are made to the objects underlying the view that affect the definition of the view. В противном случае результат запроса представления может быть непредвиденным.Otherwise, the view might produce unexpected results when it is queried.

При создании представления сведения о нем сохраняются в следующих представлениях каталога: sys.views, sys.columns и sys.sql_expression_dependencies.When a view is created, information about the view is stored in the following catalog views: sys.views, sys.columns, and sys.sql_expression_dependencies. Текст инструкции CREATE VIEW сохраняется в представлении каталога sys.sql_modules.The text of the CREATE VIEW statement is stored in the sys.sql_modules catalog view.

Запрос, в котором используется индекс представления, определенного с выражением типа numeric или float, может привести к результатам, отличным от результатов подобного запроса, в котором не используется индекс представления.A query that uses an index on a view defined with numeric or float expressions may have a result that is different from a similar query that does not use the index on the view. Это отличие может быть обусловлено ошибками округления при выполнении запросов INSERT, DELETE или UPDATE для базовых таблиц.This difference may be caused by rounding errors during INSERT, DELETE, or UPDATE actions on underlying tables.

При создании представления компонент Компонент Database EngineDatabase Engine сохраняет значения SET QUOTED_IDENTIFIER и SET ANSI_NULLS.The Компонент Database EngineDatabase Engine saves the settings of SET QUOTED_IDENTIFIER and SET ANSI_NULLS when a view is created. Эти исходные значения используются для синтаксического анализа данных представления при обращениях к нему.These original settings are used to parse the view when the view is used. Таким образом, при доступе к представлению какие-либо заданные во время клиентского сеанса значения SET QUOTED_IDENTIFIER и SET ANSI_NULLS не влияют на определение представления.Therefore, any client-session settings for SET QUOTED_IDENTIFIER and SET ANSI_NULLS do not affect the view definition when the view is accessed.

Обновляемые представленияUpdatable Views

Можно изменять данные базовой таблицы через представление до тех пор, пока выполняются следующие условия:You can modify the data of an underlying base table through a view, as long as the following conditions are true:

  • Любые изменения, в том числе инструкции UPDATE, INSERT и DELETE, должны ссылаться на столбцы только одной базовой таблицы.Any modifications, including UPDATE, INSERT, and DELETE statements, must reference columns from only one base table.

  • Изменяемые в представлении столбцы должны непосредственно ссылаться на данные столбцов базовой таблицы.The columns being modified in the view must directly reference the underlying data in the table columns. Столбцы нельзя сформировать каким-либо другим образом, в том числе:The columns cannot be derived in any other way, such as through the following:

    • агрегатными функциями: AVG, COUNT, SUM, MIN, MAX, GROUPING, STDEV, STDEVP, VAR и VARP.An aggregate function: AVG, COUNT, SUM, MIN, MAX, GROUPING, STDEV, STDEVP, VAR, and VARP.

    • на основе вычисления.A computation. Столбец нельзя вычислить по выражению, включающему другие столбцы.The column cannot be computed from an expression that uses other columns. Столбцы, сформированные при помощи операторов UNION, UNION ALL, CROSSJOIN, EXCEPT и INTERSECT, считаются вычисляемыми и также не являются обновляемыми.Columns that are formed by using the set operators UNION, UNION ALL, CROSSJOIN, EXCEPT, and INTERSECT amount to a computation and are also not updatable.

  • Предложения GROUP BY, HAVING и DISTINCT не влияют на изменяемые столбцы.The columns being modified are not affected by GROUP BY, HAVING, or DISTINCT clauses.

  • Предложение TOP не используется нигде в инструкции select_statement представления вместе с предложением WITH CHECK OPTION.TOP is not used anywhere in the select_statement of the view together with the WITH CHECK OPTION clause.

    Вышеназванные ограничения относятся ко всем подзапросам представления в предложении FROM, равно как и к самому представлению.The previous restrictions apply to any subqueries in the FROM clause of the view, just as they apply to the view itself. Как правило, компонент Компонент Database EngineDatabase Engine должен иметь возможность однозначно трассировать изменения от определения представления до одной базовой таблицы.Generally, the Компонент Database EngineDatabase Engine must be able to unambiguously trace modifications from the view definition to one base table. Дополнительные сведения см. в разделе Изменение данных через представление.For more information, see Modify Data Through a View.

    Если вышеуказанные ограничения не позволяют изменить данные через представление напрямую, рассмотрите следующие варианты.If the previous restrictions prevent you from modifying data directly through a view, consider the following options:

  • Триггеры INSTEAD OFINSTEAD OF Triggers

    Чтобы сделать представление обновляемым, для него можно создать триггеры INSTEAD OF.INSTEAD OF triggers can be created on a view to make a view updatable. Триггер INSTEAD OF выполняется вместо инструкции модификации данных, для которой он определен.The INSTEAD OF trigger is executed instead of the data modification statement on which the trigger is defined. Этот триггер позволяет пользователю указать набор действий, которые должны быть выполнены для обработки инструкции модификации данных.This trigger lets the user specify the set of actions that must happen to process the data modification statement. Таким образом, если для представления создан триггер INSTEAD OF, связанный с конкретной инструкцией модификации данных (INSERT, UPDATE или DELETE), соответствующее представление можно обновлять при помощи этой инструкции.Therefore, if an INSTEAD OF trigger exists for a view on a specific data modification statement (INSERT, UPDATE, or DELETE), the corresponding view is updatable through that statement. Дополнительные сведения о триггерах INSTEAD OF см. в разделе Триггеры DML.For more information about INSTEAD OF triggers, see DML Triggers.

  • Секционированные представленияPartitioned Views

    Секционированное представление является в то же время и обновляемым, но при этом действуют некоторые ограничения.If the view is a partitioned view, the view is updatable, subject to certain restrictions. При необходимости компонент Компонент Database EngineDatabase Engine проводит различие между локальными и распределенными секционированными представлениями. Первый тип включает представления, которые вместе со всеми соответствующими таблицами относятся к одному экземпляру SQL ServerSQL Server, а второй — представления, в которых хотя бы одна из таблиц относится к другому или удаленному серверу.When it is needed, the Компонент Database EngineDatabase Engine distinguishes local partitioned views as the views in which all participating tables and the view are on the same instance of SQL ServerSQL Server, and distributed partitioned views as the views in which at least one of the tables in the view resides on a different or remote server.

Секционированные представленияPartitioned Views

Секционированное представление — это представление, определенное посредством объединения всех (UNION ALL) таблиц-элементов, структурированных одинаковым образом, но хранимых отдельно в форме разных таблиц либо в одном экземпляре SQL ServerSQL Server, либо в группе автономных экземпляров SQL ServerSQL Server, которые называются федеративными серверами баз данных.A partitioned view is a view defined by a UNION ALL of member tables structured in the same way, but stored separately as multiple tables in either the same instance of SQL ServerSQL Server or in a group of autonomous instances of SQL ServerSQL Server servers, called federated database servers.

Примечание

Предпочтительным способом локального секционирования данных на один сервер является применение секционированных таблиц.The preferred method for partitioning data local to one server is through partitioned tables. Дополнительные сведения см. в разделе Partitioned Tables and Indexes.For more information, see Partitioned Tables and Indexes.

При разработке схемы секционирования должно быть ясно, какие данные относятся к каждой секции.In designing a partitioning scheme, it must be clear what data belongs to each partition. Например, данные таблицы Customers распределяются по трем таблицам на трех серверах: Customers_33 на сервере Server1, Customers_66 на сервере Server2 и Customers_99 на сервере Server3.For example, the data for the Customers table is distributed in three member tables in three server locations: Customers_33 on Server1, Customers_66 on Server2, and Customers_99 on Server3.

Секционированное представление на сервере Server1 определяется следующим образом.A partitioned view on Server1 is defined in the following way:

--Partitioned view as defined on Server1  
CREATE VIEW Customers  
AS  
--Select from local member table.  
SELECT *  
FROM CompanyData.dbo.Customers_33  
UNION ALL  
--Select from member table on Server2.  
SELECT *  
FROM Server2.CompanyData.dbo.Customers_66  
UNION ALL  
--Select from member table on Server3.  
SELECT *  
FROM Server3.CompanyData.dbo.Customers_99;  

Как правило, представление считают секционированным, если оно соответствует следующему формату:Generally, a view is said to be a partitioned view if it is of the following form:

SELECT <select_list1>  
FROM T1  
UNION ALL  
SELECT <select_list2>  
FROM T2  
UNION ALL  
...  
SELECT <select_listn>  
FROM Tn;  

Требования к созданию секционированных представленийConditions for Creating Partitioned Views

  1. list выборки.The select list

    • В списке столбцов определения представления должны быть выбраны все столбцы таблиц-элементов.All columns in the member tables should be selected in the column list of the view definition.

    • Столбцы, занимающие одну и ту же порядковую позицию в каждом select list, должны иметь одинаковый тип, включая параметры сортировки.The columns in the same ordinal position of each select list should be of the same type, including collations. Типы столбцов не просто должны поддерживать неявное преобразование друг в друга: в отличие от оператора UNION в данном случае этого недостаточно.It is not sufficient for the columns to be implicitly convertible types, as is generally the case for UNION.

      Кроме того, хотя бы один столбец (например, <col>) должен входить во все списки выбора в одной и той же порядковой позиции.Also, at least one column (for example <col>) must appear in all the select lists in the same ordinal position. Этот столбец <col> должен быть определен таким образом, чтобы для таблиц-элементов T1, ..., Tn на столбце C1, ..., Cn были определены ограничения CHECK с идентификаторами <col> соответственно.This <col> should be defined in a way that the member tables T1, ..., Tn have CHECK constraints C1, ..., Cn defined on <col>, respectively.

      Ограничение C1, определенное для таблицы T1, должно иметь следующий формат:Constraint C1 defined on table T1 must be of the following form:

      C1 ::= < simple_interval > [ OR < simple_interval > OR ...]  
      < simple_interval > :: =   
      < col > { < | > | \<= | >= | = < value >}   
      | < col > BETWEEN < value1 > AND < value2 >  
      | < col > IN ( value_list )  
      | < col > { > | >= } < value1 > AND  
      < col > { < | <= } < value2 >  
      
    • Ограничения должны быть такими, чтобы любое указанное значение <col> могло удовлетворять не более чем одному из ограничений C1, ..., Cn, т. е. они должны формировать совокупность неперекрывающихся интервалов.The constraints should be in such a way that any specified value of <col> can satisfy, at most, one of the constraints C1, ..., Cn so that the constraints should form a set of disjointed or nonoverlapping intervals. Столбец <col>, для которого определены неперекрывающиеся ограничения, называется столбцом секционирования.The column <col> on which the disjointed constraints are defined is called the partitioning column. Обратите внимание, что столбец секционирования может иметь другие имена в базовых таблицах.Note that the partitioning column may have different names in the underlying tables. Чтобы ограничения соответствовали вышеуказанным требованиям столбца секционирования, они должны находиться во включенном и доверенном состоянии.The constraints should be in an enabled and trusted state for them to meet the previously mentioned conditions of the partitioning column. Если ограничения отключены, включите проверку ограничений с помощью параметра CHECK CONSTRAINT constraint_name инструкции ALTER TABLE и проверьте их с использованием параметра WITH CHECK.If the constraints are disabled, re-enable constraint checking by using the CHECK CONSTRAINT constraint_name option of ALTER TABLE, and using the WITH CHECK option to validate them.

      В следующем фрагменте продемонстрированы правильные наборы ограничений:The following examples show valid sets of constraints:

      { [col < 10], [col between 11 and 20] , [col > 20] }  
      { [col between 11 and 20], [col between 21 and 30], [col between 31 and 100] }  
      
    • Один столбец не может быть указан в списке выбора несколько раз.The same column cannot be used multiple times in the select list.

  2. Столбец секционированияPartitioning column

    • Столбец секционирования является частью первичного ключа (PRIMARY KEY) таблицы.The partitioning column is a part of the PRIMARY KEY of the table.

    • Он не может быть вычисляемым столбцом, столбцом идентификаторов, столбцом по умолчанию или столбцом типа timestamp.It cannot be a computed, identity, default, or timestamp column.

    • Если для одного столбца таблицы-элемента определено более одного ограничения, ядро СУБД пропускает все ограничения и не учитывает их при определении того, является ли представление секционированным.If there is more than one constraint on the same column in a member table, the Database Engine ignores all the constraints and does not consider them when determining whether the view is a partitioned view. Чтобы соответствовать требованиям к секционированному представлению, со столбцом секционирования должно быть связано только одно ограничение секционирования.To meet the conditions of the partitioned view, there should be only one partitioning constraint on the partitioning column.

    • На возможность обновления столбца секционирования никакие ограничения не распространяются.There are no restrictions on the updatability of the partitioning column.

  3. Таблицы-элементы или базовые таблицы T1, ..., Tn.Member tables, or underlying tables T1, ..., Tn

    • Эти таблицы могут быть или локальными таблицами, или таблицами с других компьютеров, на которых выполняется SQL ServerSQL Server. Во втором случае для ссылки на таблицу должно быть использовано или четырехкомпонентное имя, или имя в формате функции OPENDATASOURCE или OPENROWSET.The tables can be either local tables or tables from other computers that are running SQL ServerSQL Server that are referenced either through a four-part name or an OPENDATASOURCE- or OPENROWSET-based name. Синтаксис функций OPENDATASOURCE и OPENROWSET позволяет указать имя таблицы, но не передаваемого запроса.The OPENDATASOURCE and OPENROWSET syntax can specify a table name, but not a pass-through query. Дополнительные сведения см. в разделе OPENDATASOURCE (Transact-SQL) и OPENROWSET (Transact-SQL).For more information, see OPENDATASOURCE (Transact-SQL) and OPENROWSET (Transact-SQL).

      Если хотя бы одна таблица-элемент является удаленной, представление называется распределенным секционированным представлением, и тогда вступают в силу дополнительные требования.If one or more of the member tables are remote, the view is called distributed partitioned view, and additional conditions apply. Они описаны ниже в данном разделе.They are described later in this section.

    • Одна таблица не может быть указана два раза в наборе таблиц, объединяемых при помощи инструкции UNION ALL.The same table cannot appear two times in the set of tables that are being combined with the UNION ALL statement.

    • Таблицы-элементы не могут иметь индексы, созданные для вычисляемых столбцов в таблице.The member tables cannot have indexes created on computed columns in the table.

    • Все ограничения первичного ключа (PRIMARY KEY), действующие в таблицах-элементах, должны быть связаны с одинаковым количеством столбцов.The member tables should have all PRIMARY KEY constraints on the same number of columns.

    • Всем таблицам-элементам в представлении должно быть назначено одинаковое значение заполнения ANSI.All member tables in the view should have the same ANSI padding setting. Его можно задать либо при помощи аргумента user options процедуры sp_configure, либо при помощи инструкции SET.This can be set by using either the user options option in sp_configure or the SET statement.

Условия изменения данных в секционированных представленияхConditions for Modifying Data in Partitioned Views

На инструкции, изменяющие секционированные представления, распространяются следующие ограничения:The following restrictions apply to statements that modify data in partitioned views:

  • В инструкции INSERT должны быть указаны значения для всех столбцов представления, даже если в базовых таблицах-элементах действует ограничение DEFAULT для этих столбцов или они поддерживают значения NULL.The INSERT statement must supply values for all the columns in the view, even if the underlying member tables have a DEFAULT constraint for those columns or if they allow for null values. Для тех столбцов таблиц-элементов, которые имеют определения DEFAULT, в инструкциях нельзя явно использовать ключевое слово DEFAULT.For those member table columns that have DEFAULT definitions, the statements cannot explicitly use the keyword DEFAULT.

  • Значение, вставляемое в столбец секционирования, должно отвечать хотя бы одному из базовых ограничений; в противном случае операция вставки завершится ошибкой из-за нарушения ограничений.The value being inserted into the partitioning column should satisfy at least one of the underlying constraints; otherwise, the insert action will fail with a constraint violation.

  • В предложении SET инструкции UPDATE в качестве значения не может быть указано ключевое слово DEFAULT, даже если столбец имеет значение DEFAULT, определенное в соответствующей таблице-элементе.UPDATE statements cannot specify the DEFAULT keyword as a value in the SET clause, even if the column has a DEFAULT value defined in the corresponding member table.

  • Столбец представления, который является столбцом идентификаторов в одной или нескольких таблицах-элементах, не может быть изменен при помощи инструкции INSERT или UPDATE.Columns in the view that are an identity column in one or more of the member tables cannot be modified by using an INSERT or UPDATE statement.

  • Если одна из таблиц-элементов содержит столбец timestamp, представление не может быть изменено при помощи инструкции INSERT или UPDATE.If one of the member tables contains a timestamp column, the data cannot be modified by using an INSERT or UPDATE statement.

  • Если одна из таблиц-элементов содержит триггер, ограничение ON UPDATE CASCADE/SET NULL/SET DEFAULT или ограничение ON DELETE CASCADE/SET NULL/SET DEFAULT, то представление не может быть изменено.If one of the member tables contains a trigger or an ON UPDATE CASCADE/SET NULL/SET DEFAULT or ON DELETE CASCADE/SET NULL/SET DEFAULT constraint, the view cannot be modified.

  • Выполнение операций INSERT, UPDATE и DELETE для секционированного представления не допускается, если осуществляется самосоединение с тем же представлением или с какой-либо из таблиц-элементов, указанных в инструкции.INSERT, UPDATE, and DELETE actions against a partitioned view are not allowed if there is a self-join with the same view or with any of the member tables in the statement.

  • Массовый импорт данных в секционированное представление не поддерживается bcp и инструкциями BULK INSERT и INSERT... SELECT * FROM OPENROWSET(BULK...).Bulk importing data into a partitioned view is unsupported by bcp or the BULK INSERT and INSERT ... SELECT * FROM OPENROWSET(BULK...) statements. Однако можно вставить в секционированное представление несколько строк с помощью инструкции INSERT.However, you can insert multiple rows into a partitioned view by using the INSERT statement.

    Примечание

    Для обновления секционированного представления пользователь должен иметь связанные с таблицами-элементами разрешения INSERT, UPDATE и DELETE.To update a partitioned view, the user must have INSERT, UPDATE, and DELETE permissions on the member tables.

Дополнительные требования, предъявляемые к распределенным секционированным представлениямAdditional Conditions for Distributed Partitioned Views

При работе с распределенными секционированными представлениями (если одна или несколько таблиц-элементов являются удаленными) действуют следующие дополнительные требования.For distributed partitioned views (when one or more member tables are remote), the following additional conditions apply:

  • Для обеспечения атомарности операций на всех узлах, затрагиваемых операцией обновления, запускается распределенная транзакция.A distributed transaction will be started to guarantee atomicity across all nodes affected by the update.

  • Чтобы инструкции INSERT, UPDATE и DELETE были выполнены успешно, параметр XACT_ABORT SET должен иметь значение ON.The XACT_ABORT SET option should be set to ON for INSERT, UPDATE, or DELETE statements to work.

  • Любые столбцы удаленных таблиц типа smallmoney, фигурирующих в секционированном представлении, сопоставляются как тип money.Any columns in remote tables of type smallmoney that are referenced in a partitioned view are mapped as money. Таким образом, соответствующие им столбцы локальных таблиц (столбцы, занимающие те же порядковые позиции в списке выбора) должны также иметь тип money.Therefore, the corresponding columns (in the same ordinal position in the select list) in the local tables must also be of type money.

  • При уровне совместимости базы данных 110 и выше любые столбцы типа smalldatetime в удаленных таблицах, фигурирующих в секционированном представлении, сопоставляются как тип smalldatetime.Under database compatibility level 110 and higher, any columns in remote tables of type smalldatetime that are referenced in a partitioned view are mapped as smalldatetime. Соответствующие им столбцы локальных таблиц (столбцы, занимающие те же порядковые позиции в списке выбора) должны иметь тип smalldatetime.Corresponding columns (in the same ordinal position in the select list) in the local tables must be smalldatetime. В этом отличие от более ранних версий SQL ServerSQL Server, где столбцы в удаленных таблицах типа smalldatetime, фигурирующих в секционированном представлении, сопоставляются как тип datetime, а соответствующие столбцы в локальных таблицах должны иметь тип datetime.This is a change in behavior from earlier versions of SQL ServerSQL Server in which any columns in remote tables of type smalldatetime that are referenced in a partitioned view are mapped as datetime and corresponding columns in local tables must be of type datetime. Дополнительные сведения см. в разделе Уровень совместимости инструкции ALTER DATABASE (Transact-SQL).For more information, see ALTER DATABASE Compatibility Level (Transact-SQL).

  • Никакой связанный сервер в секционированном представлении не может быть замкнут на себя.Any linked server in the partitioned view cannot be a loopback linked server. Это связанный сервер, указывающий на тот же экземпляр SQL ServerSQL Server.This is a linked server that points to the same instance of SQL ServerSQL Server.

    При выполнении операций INSERT, UPDATE и DELETE, в которых задействованы обновляемые секционированные представления и удаленные таблицы, параметр SET ROWCOUNT не учитывается.The setting of the SET ROWCOUNT option is ignored for INSERT, UPDATE, and DELETE actions that involve updatable partitioned views and remote tables.

    При наличии таблиц-элементов и определения секционированного представления оптимизатор запросов SQL ServerSQL Server составляет планы эффективного выполнения запросов для доступа к данным из таблиц-элементов.When the member tables and partitioned view definition are in place, the SQL ServerSQL Server query optimizer builds intelligent plans that use queries efficiently to access data from member tables. При наличии определений ограничения CHECK обработчик запросов составляет карту распределения значений ключей по таблицам-элементам.With the CHECK constraint definitions, the query processor maps the distribution of key values across the member tables. Когда пользователь выполняет запрос, обработчик запросов сравнивает карту со значениями, указанными в предложении WHERE, и создает план выполнения, позволяющий свести к минимуму объем передачи данных между серверами-элементами.When a user issues a query, the query processor compares the map to the values specified in the WHERE clause, and builds an execution plan with a minimal amount of data transfer between member servers. Следовательно, несмотря на то, что некоторые таблицы-элементы могут храниться на удаленных серверах, экземпляр SQL ServerSQL Server разрешает распределенные запросы таким образом, чтобы объем передаваемых распределенных данных оказался минимальным.Therefore, although some member tables may be located in remote servers, the instance of SQL ServerSQL Server resolves distributed queries so that the amount of distributed data that has to be transferred is minimal.

Аспекты, связанные с репликациейConsiderations for Replication

При создании секционированных представлений для таблиц-элементов, задействованных в репликации, следует учитывать следующие факторы.To create partitioned views on member tables that are involved in replication, the following considerations apply:

  • Если базовые таблицы задействованы в репликации слиянием или репликации транзакций с обновляемыми подписками, в список выбора должен быть включен столбец uniqueidentifier.If the underlying tables are involved in merge replication or transactional replication with updating subscriptions, the uniqueidentifier column should also be included in the select list.

    При выполнении любых операций INSERT в секционированном представлении необходимо предоставлять значение NEWID() для столбца uniqueidentifier.Any INSERT actions into the partitioned view must provide a NEWID() value for the uniqueidentifier column. При выполнении любых операций UPDATE для столбца uniqueidentifier необходимо предоставлять значение NEWID(), так как ключевое слово DEFAULT использовать при этом нельзя.Any UPDATE actions against the uniqueidentifier column must supply NEWID() as the value because the DEFAULT keyword cannot be used.

  • Репликация обновлений, производимых при помощи представления, выполняется так же, как и при репликации таблиц в разных базах данных: таблицы обслуживаются различными агентами репликации, и определенный порядок выполнения обновлений не гарантируется.The replication of updates made by using the view is the same as when tables are replicated in two different databases: the tables are served by different replication agents and the order of the updates is not guaranteed.

РазрешенияPermissions

Для выполнения этой инструкции требуется разрешение CREATE VIEW в отношении базы данных и разрешение ALTER в отношении схемы, в которой создается представление.Requires CREATE VIEW permission in the database and ALTER permission on the schema in which the view is being created.

ПримерыExamples

В следующих примерах используются базы данных AdventureWorks 2012 и AdventureWorksDW.The following examples use the AdventureWorks 2012 or AdventureWorksDW database.

A.A. Использование простого разрешения CREATE VIEWUsing a simple CREATE VIEW

В следующем фрагменте представление создается при помощи простой инструкции SELECT.The following example creates a view by using a simple SELECT statement. Это полезно, если нужно часто выполнять запросы с сочетанием столбцов.A simple view is helpful when a combination of columns is queried frequently. Данные этого представления извлекаются из таблиц HumanResources.Employee и Person.Person базы данных AdventureWorks2012AdventureWorks2012.The data from this view comes from the HumanResources.Employee and Person.Person tables of the AdventureWorks2012AdventureWorks2012 database. Эти данные включают имена и фамилии сотрудников Компания Adventure Works CyclesAdventure Works Cycles, а также даты их приема на работу.The data provides name and hire date information for the employees of Компания Adventure Works CyclesAdventure Works Cycles. Такое представление можно было бы создать, например для человека, следящего за профессиональными юбилеями, при этом не предоставляя ему доступ ко всем данным, хранящимся в этих таблицах.The view could be created for the person in charge of tracking work anniversaries but without giving this person access to all the data in these tables.

CREATE VIEW hiredate_view  
AS   
SELECT p.FirstName, p.LastName, e.BusinessEntityID, e.HireDate  
FROM HumanResources.Employee e   
JOIN Person.Person AS p ON e.BusinessEntityID = p.BusinessEntityID ;  
GO  

Б.B. Использование WITH ENCRYPTIONUsing WITH ENCRYPTION

Следующий пример поясняет применение параметра WITH ENCRYPTION и обращение к вычисляемым, переименованным и множественным столбцам.The following example uses the WITH ENCRYPTION option and shows computed columns, renamed columns, and multiple columns.

Применимо к: с SQL Server 2008SQL Server 2008 до SQL Server 2017SQL Server 2017 и База данных SQLSQL Database.Applies to: SQL Server 2008SQL Server 2008 through SQL Server 2017SQL Server 2017 and База данных SQLSQL Database.

CREATE VIEW Purchasing.PurchaseOrderReject  
WITH ENCRYPTION  
AS  
SELECT PurchaseOrderID, ReceivedQty, RejectedQty,   
    RejectedQty / ReceivedQty AS RejectRatio, DueDate  
FROM Purchasing.PurchaseOrderDetail  
WHERE RejectedQty / ReceivedQty > 0  
AND DueDate > CONVERT(DATETIME,'20010630',101) ;  
GO  

В.C. Использование WITH CHECK OPTIONUsing WITH CHECK OPTION

В следующем примере создается представление SeattleOnly, ссылающееся на пять таблиц и допускающее изменение данных только тех сотрудников, которые живут в Сиэтле.The following example shows a view named SeattleOnly that references five tables and allows for data modifications to apply only to employees who live in Seattle.

CREATE VIEW dbo.SeattleOnly  
AS  
SELECT p.LastName, p.FirstName, e.JobTitle, a.City, sp.StateProvinceCode  
FROM HumanResources.Employee e  
INNER JOIN Person.Person p  
ON p.BusinessEntityID = e.BusinessEntityID  
    INNER JOIN Person.BusinessEntityAddress bea   
    ON bea.BusinessEntityID = e.BusinessEntityID   
    INNER JOIN Person.Address a   
    ON a.AddressID = bea.AddressID  
    INNER JOIN Person.StateProvince sp   
    ON sp.StateProvinceID = a.StateProvinceID  
WHERE a.City = 'Seattle'  
WITH CHECK OPTION ;  
GO  

Г.D. Использование встроенных функций в представленииUsing built-in functions within a view

В следующем фрагменте показано определение представления, включающее встроенную функцию.The following example shows a view definition that includes a built-in function. Применяя функцию, следует указывать имя производного столбца.When you use functions, you must specify a column name for the derived column.

CREATE VIEW Sales.SalesPersonPerform  
AS  
SELECT TOP (100) SalesPersonID, SUM(TotalDue) AS TotalSales  
FROM Sales.SalesOrderHeader  
WHERE OrderDate > CONVERT(DATETIME,'20001231',101)  
GROUP BY SalesPersonID;  
GO  

Д.E. Использование секционированных данныхUsing partitioned data

В следующем примере используются таблицы SUPPLY1, SUPPLY2, SUPPLY3 и SUPPLY4.The following example uses tables named SUPPLY1, SUPPLY2, SUPPLY3, and SUPPLY4. Они соответствуют таблицам поставщиков из четырех офисов, расположенных в разных странах и регионах.These tables correspond to the supplier tables from four offices, located in different countries/regions.

--Create the tables and insert the values.  
CREATE TABLE dbo.SUPPLY1 (  
supplyID INT PRIMARY KEY CHECK (supplyID BETWEEN 1 and 150),  
supplier CHAR(50)  
);  
CREATE TABLE dbo.SUPPLY2 (  
supplyID INT PRIMARY KEY CHECK (supplyID BETWEEN 151 and 300),  
supplier CHAR(50)  
);  
CREATE TABLE dbo.SUPPLY3 (  
supplyID INT PRIMARY KEY CHECK (supplyID BETWEEN 301 and 450),  
supplier CHAR(50)  
);  
CREATE TABLE dbo.SUPPLY4 (  
supplyID INT PRIMARY KEY CHECK (supplyID BETWEEN 451 and 600),  
supplier CHAR(50)  
);  
GO  
--Create the view that combines all supplier tables.  
CREATE VIEW dbo.all_supplier_view  
WITH SCHEMABINDING  
AS  
SELECT supplyID, supplier  
  FROM dbo.SUPPLY1  
UNION ALL  
SELECT supplyID, supplier  
  FROM dbo.SUPPLY2  
UNION ALL  
SELECT supplyID, supplier  
  FROM dbo.SUPPLY3  
UNION ALL  
SELECT supplyID, supplier  
  FROM dbo.SUPPLY4;  
GO
INSERT dbo.SUPPLY1 VALUES ('1', 'CaliforniaCorp'), ('5', 'BraziliaLtd')  
, ('231', 'FarEast'), ('280', 'NZ')  
, ('321', 'EuroGroup'), ('442', 'UKArchip')  
, ('475', 'India'), ('521', 'Afrique');  
GO  

Примеры: Хранилище данных SQLSQL Data Warehouse и Параллельное хранилище данныхParallel Data WarehouseExamples: Хранилище данных SQLSQL Data Warehouse and Параллельное хранилище данныхParallel Data Warehouse

Е.F. Создание простого представленияCreating a simple view

В следующем примере создается представление путем выбора некоторых столбцов из исходной таблицы.The following example creates a view by selecting only some of the columns from the source table.

CREATE VIEW DimEmployeeBirthDates AS  
SELECT FirstName, LastName, BirthDate   
FROM DimEmployee;  

Ж.G. Создание представления путем соединения двух таблицCreate a view by joining two tables

В следующем примере представление создается при помощи инструкции SELECT с OUTER JOIN.The following example creates a view by using a SELECT statement with an OUTER JOIN. Результаты запроса на соединение заполняют представление.The results of the join query populate the view.

CREATE VIEW view1  
AS 
SELECT fis.CustomerKey, fis.ProductKey, fis.OrderDateKey, 
  fis.SalesTerritoryKey, dst.SalesTerritoryRegion  
FROM FactInternetSales AS fis   
LEFT OUTER JOIN DimSalesTerritory AS dst   
ON (fis.SalesTerritoryKey=dst.SalesTerritoryKey);  

См. также:See Also

ALTER TABLE (Transact-SQL) ALTER TABLE (Transact-SQL)
ALTER VIEW (Transact-SQL) ALTER VIEW (Transact-SQL)
DELETE (Transact-SQL) DELETE (Transact-SQL)
DROP VIEW (Transact-SQL) DROP VIEW (Transact-SQL)
INSERT (Transact-SQL) INSERT (Transact-SQL)
Создание хранимой процедуры Create a Stored Procedure
sys.dm_sql_referenced_entities (Transact-SQL) sys.dm_sql_referenced_entities (Transact-SQL)
sys.dm_sql_referencing_entities (Transact-SQL) sys.dm_sql_referencing_entities (Transact-SQL)
sp_help (Transact-SQL) sp_help (Transact-SQL)
sp_helptext (Transact-SQL) sp_helptext (Transact-SQL)
sp_refreshview (Transact-SQL) sp_refreshview (Transact-SQL)
sp_rename (Transact-SQL) sp_rename (Transact-SQL)
sys.views (Transact-SQL) sys.views (Transact-SQL)
UPDATE (Transact-SQL) UPDATE (Transact-SQL)
EVENTDATA (Transact-SQL)EVENTDATA (Transact-SQL)