Создание и управление индексами. Создание и управление встроенными процедурами. Оптимизация производительности запросов. Управление транзакциями и блокировками, страница 10

*  Просмотрщик не может ссылаться на временные таблицы.

*  Просмотрщик не может ссылаться более чем на 1024 колонки.

*  Нельзя комбинировать с другими Transact-SQL операторами в batch (пачку, партию).

Следующий пример просмотрщика, который рассчитывает колонку Subtotal:

USE Northwind

GO

CREATE VIEW dbo.OrderSubtotalView (OrderID, Subtotal)

AS

SELECT OD.OrderID,

SUM(CONVERT(money,(OD.UnitPrice*Quantity*(1-Discount)/100))*100)

FROM [Order Details] OD

GROUP BY OD.OrderID

GO

Пример вызова:

SELECT * FROM dbo.OrderSubtotalView

Результат работы:

OrderID     Subtotal             

----------- ---------------------

10248       440.0000

10249       1863.4000

11075       498.1000

11076       792.7500

11077       1255.7200

(830 row(s) affected)

Пример просмотрщика с объединёнными таблицами

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

В следующем примере создаётся просмотрщик двух таблиц:

USE Northwind

GO

CREATE VIEW dbo.ShipStatusView

AS

SELECT OrderID, ShippedDate, ContactName

FROM Customers c INNER JOIN Orders o

ON c.CustomerID = o.CustomerID

WHERE RequiredDate < ShippedDate

GO

Пример вызова просмотрщика:

SELECT * FROM dbo.ShipStatusView

Результат работы:

OrderID   ShippedDate               ContactName

--------- -----------------------------------------10264     1996-08-23 00:00:00.000   Maria Larsson

10271     1996-08-30 00:00:00.000   Art Braunschweiger

10280     1996-09-12 00:00:00.000   Christina Berglund

10302     1996-10-09 00:00:00.000   Pascale Cartrain

(37 row(s) affected)

Изменение и удаление просмотрщика

Иногда вам моет понадобиться изменение просмотрщика. Для этого вы можете удалить его и создать снова (при этом теряются все разрешения) или воспользоваться оператором ALTER VIEW.

Оператор ALTER VIEW изменяет объявление просмотрщика, включая индексированные просмотрщики, без затрагивания встроенных процедур или триггеров. Это позволяет вам сохранить разрешения для просмотрщика. Если вы удалите просмотрщик и создадите его заново, вы потеряете все разрешения.

Синтаксис:

ALTER VIEW [ < database_name > . ] [ < owner > . ]

view_name [ ( column [ ,...n ] ) ]

[ WITH < view_attribute > [ ,...n ] ]

AS

select_statement

[ WITH CHECK OPTION ]

Пример

Следующий пример изменяет EmploeeView для добавления колонки Extension.

USE Northwind

GO

ALTER VIEW dbo.EmployeeView

AS

SELECT lastName, FirstName, Extension

FROM Employees

GO

Пример вызова:

SELECT * FROM dbo.EmployeeView

Результат:

lastName             FirstName  Extension

-------------------- ---------- ---------

Davolio              Nancy      5467

Fuller               Andrew     3457

Leverling            Janet      3355

...

(9 row(s) affected)

Если вам долгое время не нужен будет просмотрщик, вы можете удалить его с помощью оператора DROP VIEW.

Предотвращение разорванных цепочек наследования

Сервер SQL позволяет вам владеть объектом для контролирования пользователей, которые авторизованы для доступа к ним.

Объявление просмотрщика зависит от основного объекта (просмотрщика или таблицы). Эта зависимость может быть воспринята как наследственная связь. Если вы владеете просмотрщиком, вы также владеете основным объектом. Если объект используется, то разрешение назначается только просмотрщику.

Для предотвращения разрыва цепочек наследования, владельцем всех просмотрщиков должен быть dbo. Когда объект используется, разрешения назначаются каждому зависимому объекту с различными владельцами.

Таня владеет view2. С помощью следующей команды, она может назначить разрешения для Миши:

GRANT select ON view2 TO Misha

Однако, view2 зависит от объекта view1, владельцем которого является Женя. Разрешения назначены каждому зависимому объекту с разными владельцами. Миша может выполнить просмотрщик, используя следующую команду:

SELECT * FROM tanya.view2

Если Женя дал Мише разрешение на вызов view1, то Миша сможет выполнить этот запрос.