|
Страница 1 из 3 Трудно точно провести грань, говоря о новой семантике SQL:1999, но мы приведем краткий перечень того, что мы считаем наиболее важными поведенческими аспектами языка. В течение долгого времени разработчики приложений испытывали потребность в допущении операций обновления к более широкому классу представлений. Во многих средах представления активно использовались как механизм безопасности и/или средство упрощения взгляда на базу данных со стороны приложения. Однако, если большая часть представлений не допускает операций обновления, то эти приложения часто вынуждаются "отстраниться" от механизма представлений и полагаться на прямое обновления определяющих базовых таблиц; эта ситуация весьма неудовлетворительна. В SQL:1999 существенно расширен диапазон представлений, над которыми напрямую могут выполняться операции обновления с использованием только средств, обеспечиваемых стандартом. Этот диапазон сильно зависит от функциональных зависимостей для определения того, к каким дополнительным представлениям могут применяться операции обновления, и того, как изменять данные определяющих базовых таблиц при выполнении операций обновления представлений.
Другим широко порицаемым недостатком SQL является невозможность выполнения рекурсии для приложения типа обработки инвентарных ведомостей. Для удовлетворения этой категории требований SQL:1999 обеспечивает средство, называемое рекурсивными запросами. Написание рекурсивного запроса вовлекает написание выражения запроса, которое вы хотите включить в рекурсию и присвоение ему имени, а затем использование этого имени в соответствующем выражении запроса: WITH RECURSIVE Q1 AS SELECT ... FROM ... WHERE ..., Q2 AS SELECT ... FROM ... WHERE ... SELECT ... FROM Q1, Q2 WHERE ... Мы уже упоминали локаторы как значение на стороне клиента, которое может представлять LOB-значение, хранимое на стороне сервера. Таким же образом локаторы могут быть использованы для представления ARRAY-значений, если принять во внимание тот факт, что (подобно LOB’ам) ARRAY-значение часто может быть слишком велико, чтобы обычным образом передаваться между приложением и базой данных. Локаторы также могут использоваться для представления значений определяемых пользователем типов — обсуждаемых далее — которые тоже могут потенциально быть большими и громоздкими. Наконец, в SQL:1999 добавлено понятие точек сохранения (savepoints), реализованных во многих приложениях. Точка сохранения немного похожа на подтранзакцию в том смысле, что приложение может выполнить откат действий, выполненных после начала точки сохранения, не откатывая все действия транзакции целиком. SQL:1999 допускает выполнение операций ROLLBACK TO SAVEPOINT и RELEASE SAVEPOINT, которыет во многом действуют подобно фиксации подтранзакции. Улучшенная безопасность Новым средством безопасности SQL:1999 основано на понятии роли (role). Привилегии могут предоставляться ролям таким же образом, как если бы они были индивидуальными идентификаторами авторизации, и роли могут предоставляться идентификаторам авторизации и другим ролям. Эта вложенная структура может в громадной степени упростить зачастую трудную работу управления безопасностью в среде баз данных. В последние несколько лет роли реализованы во многих SQL-продуктах (хотя иногда под другими названиями); в конце концов роли попали и в стандарт. Активные базы данных В стандарте SQL:1999 отдается должное активным базам данных, хотя и на несколько лет позже появления их реализаций. Эта возможность обеспечивается через средство, называемое триггерами (triggers). Как известно многим читателям, триггер — это предоставляемое разработчикам базы данных средство заставить систему баз данных выполнять некоторые операции каждый раз, когда приложение запрашивает выполнение определенных операций над указанными таблицами. Например, триггеры можно использовать для журнализации всех операций, которые изменяют значение заработной платы в таблице служащих: CREATE TRIGGER log_salupdate BEFORE UPDATE OF salary ON employees REFERENCINGOLD ROW as oldrow NEW ROW as newrow FOR EACH ROW INSERT INTO log_table VALUES (CURRENT_USER, oldrow.salary, newrow.salary) Триггеры могут использоваться для многих целей, не только для журнализации. Например, можно написать триггеры для балансировки бюджета путем сокращения капиталовложений при найме новых служащих ... и возбуждения исключительной ситуации, если денежных средств для этого недостаточно. Объектная ориентация В дополнение к более традиционным возможностям SQL, обсуждавшимся до сих пор, разработка SQL:1999 была в большой степени ориентирована — некоторые наблюдатели сказали бы, что в слишком большой степени — на добавление в язык поддержки объектно-ориентированных концепций. Некоторые из возможностей, относящихся к этой категории, были впервые определены в стандарте SQL/PSM, опубликованном в конце 1996 г. — конкретно, поддержка функций и процедур, вызываемых из операторов SQL. В SQL:1999 это средство, называемое вызываемыми из SQL подпрограммами, развивается за счет добавления третьего класса подпрограмм, именумых методами, к рассмотрению которых мы скоро перейдем. Мы не хотели бы копаться здесь в вызываемых из SQL функциях и процедурах, и отсылаем читателей к более раннему выпуску SIGMOD Record [6]. Структурные определяемые пользователями типы Наиболее фундаментальным средством SQL:1999, поддерживающим объектную ориентацию, являются структурные определяемые пользователями типы; слово "структурный" отличает это средство от индивидуальных типов (которые тоже являются "определяемыми пользователями" типами, но в SQL:1999 могут базироваться только на встроенных типах SQL и поэтому не могут иметь ассоциированных с ними структур). Структурные типы имеют ряд характеристик, наиболее важными из которых являются следующие: Они могут определяться с одним или более атрибутами, каждый из которых может иметь любой допустимый в SQL тип, включая такие встроенные типы как INTEGER, такие типы коллекции как ARRAY или любой структурный тип (вложенный настолько, насколько это желательно). Все аспекты их поведения характеризуются методами, функциями и процедурами. Их атрибуты инкапсулированы через генерируемые системой функции наблюдения и изменения (функции "get" и "set"), единственные, обеспечивающие доступ к соответствующим значениям. Однако эти генерируемые системой функции нельзя перегружать; все остальные функции и методы могут быть перегружены. Сравнения их значений выполняются только через определяемые пользователями функции. Они могут участвовать в иерархиях типов, в которых более специализированные типы (подтипы) имеют все атрибуты и используют все функции, ассоциированные с более обобщенными типами (супертипами), но могут иметь новые атрибуты и подпрограммы.
|