Программирование >>  Программирование баз данных 

1 ... 100 101 102 [ 103 ] 104 105 106 ... 346


К счастью, в данном случае указанную проблему можно обойти, выполнив соединение с таблицей sysob j ects:

SELECT sc.text

FROM sys.syscomments sc

JOIN sys.objects so

ON sc.id = so.object id JOIN sys.schemas ss

ON so.schema id = ss.schema id WHERE so.name = vStateProvinceCountryRegion AND ss.name = Person

И в этом случае формируется тот же блок кода (действительно, в данном случае действия, выполняемые в процедуре sp helptext, сводятся к применению аналогичного запроса).

Фактически в приведенном выше коде автор специально предусмотрел применение и описанных ранее, и новых конструкций.

В предыдущих версиях SQL Server допускалось довольно свободное обращение с так называемыми системными объектами. При этом чаще всего разработчики осуществляли непосредственный доступ к таблицам sysob j ects, sysdepends, sys comments, a также к некоторым другим объектам. Хотя представители корпорации Microsoft не раз предупреждали пользователей, чтю такая возможность со временем будет исключена и не следует строить какие-тю долговременные планы, основанные на непосредственном использовании системных объектов, многие потребности разработчиков в получении информации оставались не удовлетворенными, поэтому им приходилось так или иначе действовать вопреки этой рекомендации.

Начиная с версии SQL Seruer 2005 специалисты корпорации Microsoft приетупили к реализации замысла, предусматривающего отказ от предоставления доступа пользователям к основным системным таблицам (сучетюм тюго, чтю многие из них так или иначе были заменены за истекшие годы представлениями) и переход к использованию функций, возвращающих результаты в виде наборов пшблиц, которые со временем спшновятея все более и более надежными. В приведенном выше запросе применяется сочетание устаревающих конструкций доступа к таблице sys comments и современных конструкций, иепользуе-мых для доступа к объектам, которые должны применяться вместю некотюрых других системных таблиц. Автор настюятельно рекомендует заблаговременно переходить к ие-пользованию подобных системных функций, пока еще есть такая возможность.

Защита кода - шифрование представлений

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

Чтобы зашифровать код представления, необходимо включить в оператор создания представления ключевое слово WITH ENCRYPTION. Но если в определении представления используется конструкция WITH CHECK OPTION, то приходится учитывать несколько дополнительных требований, описанных ниже.



Ключевое слово WITH ENCRYPTION должно быть введено после имени представления, но перед ключевым словом AS.

С 1слючевым словом WITH ENCRYPTION не должно использоваться ключевое слово OPTION.

Кроме того, следует помнить, что в случае модификации представления с помощью оператора ALTER VIEW происходит полная замена в базе данных существующего представления и остаются неизменными только назначенные права доступа. Это означает, что при этом из базы данных удаляется также зашифрованный текст представления. Поэтому если требуется, чтобы модифицированное представление та1сже было зашифровано, то конструкция WITH ENCRYPTION должна быть предусмотрена и в операторе ALTER VIEW.

Рассмотрим пример применения оператора ALTER VIEW к представлению Customer-Orders vw, которое было создано в одном из предьщущих разделов данной главы. Если же читатель не выполнил упражнение по созданию представления CustomerOrders vw, то может просто заменить в следующем коде ключевое слово ALTER словом CREATE (напоминаем, что следующий оператор должен быть выполнен применительно к базе данных AdventureWorks):

ALTER VIEW CustomerOrders vw

WITH ENCRYPTION

SELECT o.SalesOrderlD,

o.OrderDate,

od.ProductID,

p.Name,

od.OrderQty,

od.UnitPrice,

od.LineTotal FROM Sales.SalesOrderHeader AS о JOIN Sales.SalesOrderDetail AS od

ON o.SalesOrderlD = od.SalesOrderlD JOIN Production.Product AS p

ON od.ProductID = p.ProductID

После выполнения этого оператора предпримем попытку ознакомиться с определением представления CustomerOrders vw с помощью процедуры sp helptext: EXEC sp helptext CustomerOrders vw

СУБД SQL Server сразу же сообщает, что не может выполнить это требование: The text for object CustomerOrders vw is encrypted.

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

SELECT sc.text FROM syscomments sc JOIN sys.objects so

ON sc.id = so.object id JOIN sys.schemas ss

ON so.schema id = ss.schema id WHERE so.name = CustomerOrders vw AND ss.name = dbo

Ho и эта попытка не принесет желаемых результатов, поскольку СУБД SQL Server распознает, что таблица зашифрована, и вьщаст результат NULL.



Короче говоря, зашифрованный код представления становится недоступным. Безуспешными являются даже попытки получить к нему доступ с помощью других средств просмотра (таких как программа Management Studio, которая фактически даже не обозначает как доступную команду Modify, относящуюся к зашифрованному представлению).

Прежде чем воспользоваться опщ1ей WITH ENCRYPTION, необходимо сохранить копию исходного кода представления где-то в надежном месте. После ввода в ба-f зу данных зашифрованного представления исключается возможность восстановить исходный код этого представления хоть каким-то образом. Если окажется, что резервная копия кода, хранящаяся в другом месте, отсутствует, а в определение представления необходимо внести изменение, то вам придется написать это определение полностью заново.

Связывание представления со схемой

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

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

Связывание представления со схемой исключает возможность того, что представление станет зависшим в результате изменений в основополагающих объектах. Например, может оказаться, что в базе данных будет удален какой-то объект в результате вьшолнения оператора DROP или будут внесены какие-то другие изменения (вплоть до удаления столбца, от которого зависит работа представления), но при этом не будут учтены последствия, связанные с применением представления. Если же представление обозначено как Schema Bound (Связанное со схемой), то этого не может произойти.

Обеспечение возможности создания индексированных представлений. Если на представлении должен быть задан индекс, то представление необходимо создать с помощью опции SCHEMABINDING. (Индексированные представления рассматриваются ниже.)

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

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



1 ... 100 101 102 [ 103 ] 104 105 106 ... 346

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика