Oracle toma что это

Обновлено: 07.07.2024

Oracle Cloud Free Tier бесплатный виртуальный сервер VPS и проброс портов

Вот что пишет сама Oracle:

В приложении Oracle Cloud Free Tier можно создать аккаунт Oracle Cloud, в котором Вам будут доступны сервисы Always Free и бесплатная пробная версия Вашего продукта. Вместе с ней доступен бонус в размере 300 долларов США, который Вы можете потратить на тестирование любых доступных сервисов Oracle Cloud Infrastructure. Бонус, как и сама пробная версия, предоставляется на 30 дней. Сервисами Always Free можно пользоваться бессрочно. Сервисы, доступные для бесплатного тестирования, можно использовать, пока Вы не израсходуете сумму бонуса (300 долларов США) или не истекут 30 дней пробного периода (что произойдет раньше).

Часто задаваемые вопросы об Oracle Cloud Free Tier | Oracle Россия и СНГ

Сама регистрация не сказал бы, что простая, но и не сложная. Главное вводить все правдивые данные, а имя фамилию как на карте. Затем указать данные карты. Сначала спишут 0.83 евро. Затем я ждал сутки письма, пришло и как только перешел по ссылке в письме, то списали аж 10 евро, правда и в первом и во втором случаи моментально вернули деньги обратно.

Когда вы попадаете в личный кабинет то видите такую картину:

Oracle Cloud Free Tier бесплатный виртуальный сервер VPS и проброс портов

Oracle Cloud Free Tier бесплатный виртуальный сервер VPS

Все бесплатные услуги помечены соответствующим значком.

Создать виртуальную машину не сложно, но есть нюансы.


Нажимаем создать виртуальную машину


Придумываем имя и жмем Edit для выбора образа


Выбираем образ, я за Ubuntu, помеченный бесплатным .


Первый раз нужно будет создать приватную сеть

Заметьте, это первая особенность Oracle Cloud, на виртуальном сервере не будет белого общедоступного IP адреса. IP адрес будет взят из диапазона 10.0.0.0/16 так как этот диапазон создан по умолчанию. В дебрях настроек можно этот диапазон изменить, но сейчас речь не об этом. Но белый общедоступный IP адрес у вас всетаки будете, но он будет работать через NAT. И нужно будет что делать? правильно пробрасывать порты на NAT сервере. Об этом чуть позже.


Обязательно скачайте ключи.

Дело в том, что образы Oracle не поддерживают изначально доступ по паролю, только по ключу и если вы его не скачаете, то подключиться к своему виртуальному серверу не сможете. Кстати, откройте ссылку в браузере SSH Key pair тут подробно описано как подключиться к вашей виртуалке с помощью ключа и Putty.


Рекомендую выбрать размер диска

Если не выбрать размер диска, то он будет равен 46Гбайт.

Когда все выбрано смело жмем кнопку CREATE внизу страницы и начнется создание и запуск вашей первой бесплатной виртуально машины в облаке Oracle.

Вот так это будет выглядить:


Первое на что надо обратить внимание, это публичный адрес. Именно по этому адресу можно подключиться к виртуальной машине. Так же есть имя пользователя. А пароль как я уже и говорил только по ключу, который вы должны были скачать на этапе создания VPS.

И все бы хорошо, но как я и говорил, у вас открыт только 22 порт и виртуальный сервер находится за NAT сервером. Что бы попасть на ваш бесплатный виртуальный сервер Oracle по другому порту, например 80 или 443, вам нужно сделать несколько вещей. Первое, жмем на Virtual cloud network (на скрине выше кнопка с лева внизу).

Попадаем в такое меню, где надо выбрать Security List и затем сам лист:


Вот тут и надо разрешить требуемый порт отличный от 22



Вот так выглядит правило разрешающее доступ к виртуальному серверу по 80 порту

Но и это еще не все. Вообще все это меню в сервисе Oracle весьма запутанное и парой, что бы сделать элементарные вещи, нужн несколько часов читать документацию.

Дело в том, что оразы, которые Oracle раскатывает содержат включенный фаервол, который тоже блокирует все порты кроме 22. И соответственно нужно еще и в самой виртуалке открыть порт 80. Делается это такой командой:

Только после этого с интернета появится доступ к вашему бесплатному виртуальному серверу Oracle по 80 порту.

Но и это еще не все. Теперь нужно сохранить эти правила в конфигурацию, что бы после перезагрузки они никуда не делись. Для этого нужно добавить в файл /etc/iptables/rules.v4 следующее, но так что бы оно стояло перед REJECT :

Ох и на придумывали же они. ))))

Вот такое вот оно Oracle Cloud Free Tier бесплатный виртуальный сервер VPS и проброс портов.

Я участвую в бакалавриате, и у меня нет особых проблем при предоставлении прав собственности пользователю A на хранимую процедуру, принадлежащую пользователю B в базе данных Oracle 10g mode = xe.

Пожалуйста, помогите мне написать команды sql для предоставления прав собственности на хранимую процедуру xyz другому пользователю A.

Я не уверен, что понимаю, что вы подразумеваете под "правами собственности".

Если пользователь B владеет хранимой процедурой, пользователь B может предоставить пользователю разрешение на выполнение хранимой процедуры

Затем пользователь A вызовет процедуру, используя полное имя, т.е.

В качестве альтернативы, пользователь A может создать синоним, чтобы избежать использования полного имени процедуры.

Вы не можете делать то, что, я думаю, вы просите.

Единственными привилегиями, которые вы можете предоставить для процедур, являются EXECUTE и DEBUG.

Как упоминал Джастин, способ предоставить права выполнения A для процедуры, принадлежащей B:

В вашей учетной записи DBA дайте USERB право создать процедуру с помощью гранта grant create any procedure to USERB

Процедура будет выглядеть

Я знаю, что это очень старый вопрос, но я надеюсь, что смогу немного его починить.

Пакеты и хранимые процедуры в Oracle выполняются по умолчанию, используя права пакета/процедуры OWNER, а не текущего пользователя.

Итак, если вы вызываете пакет, который создает пользователя, например, его владельца пакета, а не вызывающего пользователя, которому требуется создать пользовательскую привилегию. Абонент просто должен иметь разрешение на выполнение в пакете.

Если вы предпочитаете, чтобы пакет был запущен с использованием разрешений вызывающего пользователя, тогда при создании пакета вам необходимо указать AUTHID CURRENT_USER

Реализация инструкции GRANT в системе Oracle поддерживает огромное количество вариантов и изменений. Синтаксис ее следующий.

[WITH OPTION] [IDENTIFIED BY пароль] [WIТН ADMIN OPTION];

Вы можете присваивать несколько привилегий в одной инструкции, но эти привилегии должны относиться к одному типу (объектные, системные или ролевые).

Например, вы можете предоставить пользователю три объектные привилегии в одной таблице при помощи одной инструкции GRANT, затем при помощи отдельной инструкции назначить две системные привилегии какой-нибудь роли, а в третьей инструкции присвоить пользователю несколько ролей, но нельзя сделать все это в одной инструкции GRANT.

Ниже приводятся параметры инструкции GRANT платформы Oracle.

объект_имя_привилегия

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

ALL [PRIVILEGES]

Присваиваются все доступные привилегии доступа к объекту схемы. Можно применять к таблицам.

ALTER

Предоставляется право изменять существующую таблицу при помощи инструкции ALTER TABLE. Можно применять к таблицам и последовательностям.

DEBUG

Предоставляется право обращаться к таблице при помощи отладчика. Этот доступ применим к любым триггерам таблицы и любой информации о коде SQL, напрямую обращавшемся к таблице. Можно применять к таблицам, представлениям, процедурам, функциям, пакетам, объектам Java и типам.

EXECUTE

Предоставляется право запускать хранимую процедуру, пользовательскую функцию или пакет. Можно применять к процедурам, функциям, пакетам, объектам Java, библиотекам, типам, индексным типам и пользовательским операторам.

INDEX

Предоставляется право создавать индексы по таблице.

(ON COMMIT REFRESH QUERY REWRITE>

Предоставляется привилегия создавать материализованные представления, обновляющиеся после транзакции (refresh-on-commit), или создавать материализованное представление для переписывания запросов к указанной таблице. Применяется только к материализованным представлениям.

Предоставляется привилегия читать и записывать файлы в директорию, указанную с помощью полного пути к директории операционной системы. Поскольку система Oracle имеет возможность сохранять файлы за пределами базы данных, серверный процесс Oracle должен быть запущен пользователем, имеющим привилегии доступа к указанным директориям. Вы можете включить в Oracle при помощи этого механизма систему обеспечения безопасности на уровне отдельных пользователей. Обратите внимание, что предложение WRITE можно использовать только с внешней таблицей, например файлом журнала или файлом ошибок.

REFERENCES

Предоставляется право определять ограничения, обеспечивающие ссылочную целостность. Можно использовать в таблицах.

(SELECT | INSERT | UPDATE DELETE>

Предоставляется право выполнять соответствующие команды SQL применительно к указанному объекту схемы. Можно использовать в таблицах, представлениях, последовательностях (только SELECT) и материализованных представлениях (только SELECT). Отметьте, что вы должны предоставить привилегию SELECT тому пользователю или роли, которому требуется привилегия DELETE. Вы можете назначать привилегии на уровне столбцов, включив в инструкцию, после имени объекта, заключенный в скобки список столбцов. Это возможно только при предоставлении объектных привилегий INSERT, REFERENCES или UPDATE в таблице или представлении.

UNDER

Предоставляется право создавать представления-потомки указанного представления. Используется только с представлениями и типами.

системная_привилегия

Указанная системная привилегия Oracle назначается одному или нескольким пользователям или ролям. Например, вы можете предоставлять такие привилегии, как CREATE TRIGGER или ALTER USER. В обоих случаях предоставление системной привилегии наделяет пользователя или роль правом выполнять команду с соответствующим именем. Полный список системных привилегий приводится в 3.2 ниже в этом разделе.

роль

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

CONNECT, RESOURCE и DBA

Предлагаются для обратной совместимости с предыдущими версиями Oracle.

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

DELETEJOA TALOGJROLE, EXECUTEJJA TALOGJROLE и SELECT_СА TALOGJ.OLE

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

EXP_FULL_DATABASE и IMP_FULL_DATABASE

Пользователи, которым присвоена эта роль, могут запускать утилиты импорта и экспорта.

AQJJSERJROLE и AQ_ADMINISTRATORJROLE

Пользователи, которым присвоена эта роль, могут использовать или администрировать такую функциональность Oracle, как Advanced Queuing.

SNMPAGENT

Присваивается только Oracle Enterprise Manager и Intelligent Agent.

RECOVERY_CATA LOGO WNER

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

HS_ADMIN_ROLE

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

ON имя_схемы

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

DIRECTORY

Предоставляются права доступа к объекту-директории, который представляет собой объект Oracle, соответствующий директории в файловой системе.

JAVA

Предоставляются привилегии доступа к Java-объектам схемы SOURCE и RESOURCE.

Указывается пользователь или роль, получающая данную привилегию. Ключевое слово PUBLIC также можно использовать при отмене привилегии, назначенной для роли PUBLIC. Можно через запятую перечислить нескольких получателей привилегии.

WITH GRANT OPTION

Позволяет получателю привилегии назначать эти привилегии другим пользователям или роли PUBLIC, но никаким другим ролям.

WITH HIERARCHY OPTION

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

IDENTIFIED BY пароль [WITH ADMIN OPTION]

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

WITH ADMIN OPTION

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

Назначение привилегий пользователям вступает в силу немедленно. Назначение ролей вступает в силу немедленно, если роль задействована. В противном случае назначение вступает в силу после включения роли. Обратите внимание, что роли можно назначать пользователям и другим ролям (в том числе PUBLIC). Пример:

GRANT sales_reader ТО salesjnanager;

Чтобы предоставлять привилегии доступа к представлению, вы должны иметь в базовых таблицах представления данные привилегии, с указанием предложения WITH GRANT OPTION.

Если вы захотите предоставить привилегии всем пользователям, просто назначьте эти привилегии роли PUBLIC.

GRANT SELECT ON work_schedule TO public;

Тем не менее существуют определенные ограничения в предоставлении системных привилегий и ролей.

  • Привилегия или роль не должна встречаться в инструкции GRANT больше одного раза.
  • Роль нельзя назначить самой себе.
  • Роли не могут назначаться рекурсивно, то есть нельзя назначить роль sales_reader роли sales_manager, а потом присвоить роль sales_manager роли sales_reader.

Вы можете присваивать несколько однотипных привилегий в одной инструкции GRANT. Однако эти привилегии должны относиться к объектам одного типа.

GRANT UPDATE (emp_id, job_id), REFERENCES (emp_id)

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

Почти все поддерживаемые Oracle функциональности и команды могут назначаться в виде привилегий в инструкции GRANT (как это показывает 3.2). Привилегии можно назначать не только применительно к объектам базы данных (таким, как таблицы и представления) и системным командам (таким, как CREATE ANY TABLE), но также и к объектам схем (таким, как DIRECTORY, JAVA SOURCE и RESOURCE).

Параметр ANY, показанный в 3.2, предоставляет права выполнения данной инструкции применительно к объектам указанного типа, принадлежащим любому пользователю в схеме. Без опции ANY пользователь сможет применять инструкции только к объектам в своей собственной схеме. Более полный список системных привилегий Oracle приведен в 3.2.

Все привилегии, показанные в 3.2 и содержащие ключевое слово ANY, имеют особое значение. В частности, ключевое слово ANY дает пользователям право выполнять указанную операцию в любой схеме. Если вы хотите включить сюда все пользовательские схемы, но исключить схему SYS, установите инициализационный параметр 07 DICTIONARY ACCESSIBILITY ъ заданное для него по умолчанию значение FALSE.

Дополнительная информация по теме

Некоторые советы и методы использования инструкции INSERT в базах данных на платформе Oracle

Правила и методы использования инструкции FETCH в базах данных на платформе Oracle

Способы и методы использования инструкции DELETE в базах данных на платформе Oracle

Некоторые советы и методы использования инструкции GRANT в базах данных на платформе DB2

По умолчанию аккаунт не имеет никаких прав в БД Oracle. Невозможно даже создать подключения без назначенных прав. И даже после получения прав на подключения, аккаунт не может сделать ничего полезного (или опасного) без получения соответсвующих прав. Права назначаются с помощью команды GRANT и убираются с помощью команды REVOKE. Дополнительные директивы команды используются для разрешения аккаунта делится правами которые у него есть с другими пользователями. По умолчанию только аккаунта администратора (SYS и SYSTEM) владеют правами назначения прав. Пользователь который назначает права другому пользователю называется grantor когда получатель прав – grantee. Права разбиты на две группы: системные права, которые грубо говоря позволяют пользователю совершать действия влияющие на словарь данных, и права над объектами, которые позволяют пользователю совершать действия влияющие на данные.

Системные права

Всего доступно около двух сотен системных прав. Большинство из них влияет на действия затрагивающие словать данных (такие как создание таблиц или пользователей). Остальные влияют на экземпляр или БД (создание табличны пространств, изменение параметров БД и создание сессий). Наиболее часто используемые права это

  • CREATESESSION – права на подключения. Без этих прав вы даже не сможете подключиться к БД
  • RESTRICTEDSESSION – Если БД запущена с директивой STARTUPRESTRICT или применялась команда ALTERSYSTEMENABLERESTRICTEDSESSION, то только пользователи с этими правами смогут подключаться к БД
  • ALTERDATABASE – разрешает выполнять команды влияющие на физические структуры
  • ALTERSYSTEM – разрешает изменять параметры экземпляра и структуры памяти
  • CREATETABLESPACE – вместе с ALTERTABLESPACE и DROPTABLESPACE позволяют пользователю управлять табличными пространтсвами
  • CREATETABLE – позволяет gratee создавать таблицы в своей схеме; включает возможность создавать, изменять и удалять таблицы, выполнять команды DML и select и управлять индексами
  • GRANTANYOBJECTPRIVILEGE – позволяет grantee управлять правами объектов которые ему не принаджлежат, но не даёт прав ему самому
  • CREATEANYTABLE – grantee может создавать таблицы которые принадлежат другим аккаунтам
  • DROPANYTABLE – grantee позволяется удалять таблицы которые принадлежат другим аккаунтам
  • INSERTANYTABLE, UPDATEANYTABLE, DELETEANYTABLE – даёт grantee право выполнять DML команды над объектами которые ему не принадлежат
  • SELECTANYTABLE – Даёт право grantee выполнять SELECT к любмы таблицам.

Синтаксис для назначения прав

GRANT privilege [,privilege…] TO username;

После создания аккаунта, обычно назначаются права часто используемые пользователями кто вовлечён в разработку приложения

grant create session, alter session,

create table, create view, create synonym, create cluster,

create database link, create sequence,

create trigger, create type, create procedure, create operator

Эти права позволяют подключаться и настраивать сессию, создавать объекты и хранить PL/SQL объекты. Объекты могут быть созданы только в схеме аккаунта; нет прав к схемам других аккаунтов. Также создание объектов ограничивается лмимитами табличных пространств.

Другим вариантом назначения прав будет назначение grantee доступа для переназначения прав другим аккаунтам. Например

grant create table to scott with admin option;

grant create table to jon;

Выполнение этих команд позволит SCOTT создавать таблицы в совей схеме, и выполнять команду GRANT. SCOTT даёт права пользователю JON создавать таблицы – но JON сможет создавать таблицы только в схеме JON. На рисунке 6-5 показаны права пользователя в Database Control; ту же информацию можно получить выполнив запрос к представлению DBA_SYS_PRIVS.

Если системные разрешения были отозваны, все действия которые вы выполнили пока у вас были права остаются в силе. Если у вас были права с ADMIN OPTION то у всех пользователей которым вы назначили права – права остаются, несмотря на то что у вас права отозвали. Не остаётся записей кто именно назначил системные привилегии, таким образом невозможно забрать права CASCADE как показано на рисунке 6-6

Revocation of a system privilege will not cascade (unlike

revocation of an object privilege).

Права ANY дают доступ ко всем объектам в БД. Таким образом

grant select any table to scott

позволить аккаунту SCOTT выполнять запрос SELECT ко всем таблицам во всех схемах БД. Такое назначение прав считается дурным тоном и ANY права назначаются только DBA.


In fact, ANY is not as dangerous now as with earlier releases. It no longer

includes tables in the SYS schema, so the data dictionary is still protected. But

ANY should still be used with extreme caution, as it removes all protection

from user tables.


Объектные права

Объектные права дают доступ к выполнению команд DML и SELECT к соответствующим объектам и выполнению PL/SQL объектов. Эти права не существуют для объектов в схеме аккаунта; если у пользователя есть системные права CREATE TABLE – это значит что он может выполнять SELECT и DML запросы к таблицам которые он создал без дополнительных прав.

The ANY privileges, that grant permissions against objects in

every user account in the database, are not object privileges—they are

Объектные права применяются к разным группам объектов


GRANT privilege ON [schema.]object TO username [WITH GRANT OPTION];

grant select on store.customers to scott;

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

grant select on store.orders to scott;

grant update (order_status) on store.orders to scott;

grant all on store.regions to scott;

Эти команды позволят аккаунту SCOTT выполнять запрос SELECT ко всем столбцам таблицы ORDERS в схеме STORE но обновлять данные только в одном столбце. Также у аккаунта SCOTT есть доступ ко всем операциям к таблице REGIONS. На рисунке 6-7 отображается результат назначения прав при просмотре в Database Control

Granting privileges at the column level is often said to be bad practice

because of the massive workload involved. If it is necessary to restrict peoples’

access to certain columns, creating a view that shows only those columns will


often be a better alternative.

Использование директивы WITH GRANT OPTION позволит пользователю передавать свои права другим аккаунта. Оракл хранит информацию о том кто и кому дал доступ на объектном уровне; это позволяет отзывать права учитывая эту информацию. Рассмотрим пример

Аналитические функции - очень мощный инструмент в SQL. Со слов Тома Кайта, можно написать отдельную книгу по аналитическим функциям, настолько они полезны.

Аналитические функции - это те же агрегирующие функции, но их главная особенность в том, что они работают без необходимости группировки строк.

Аналитические функции выполняются последними в запросе, поэтому они могут быть использованы только в SELECT части запроса, либо в ORDER BY .

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

Посмотрим, какие данные теперь хранятся в таблице:


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


Усложним задачу: напишем запрос, который будет возвращать отдельной колонкой максимальный стаж на должности каждого сотрудника. Для этого также можно использовать подзапрос, только уже коррелированный:


Теперь решим эти же задачи при помощи аналитический функций:

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

Помимо этого, вот еще два примера запросов с аналитическими функциями.


Две колонки, max_exp_asc и max_exp_desc , считают максимальный стаж среди сотрудников в порядке возрастания и убывания их имен соответственно.

С простыми примерами аналитических функций мы познакомились, теперь разберемся,как они работают.

Когда агрегирующая функция становится аналитической

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

Подсчет результатов по группам. Partition by

Для того, чтобы результаты считались по определенным группам, нужно использовать конструкцию partition by , в которой нужно указать колонки, по которым будет производиться вычисление.

В данном примере, который уже приводился раньше, максимальный стаж вычисляется в отдельности для каждой из профессий, и затем добавляется к каждой строке.

Посчитаем количество сотрудников по должностям и выведем отдельной колонкой:


Результаты можно считать по нескольким группам. Выведем напротив каждого сотрудника общее число сотрудников, родившихся в том же месяце(колонка mnth_cnt ) и количество сотрудников, родившихся в том же месяце и занимающих такую же должность:


Всего есть три сотрудника, которые родились в одном и том же месяце - июле. Поэтому в колонке mnth_cnt отображается число 3. В то же время, есть лишь два сотрудника, которые родились в одном и том же месяце, и при этом занимают одну и ту же должность - это сотрудники с id равными 2 и 3.

Порядок вычисления. Order by

В аналитических функциях можно указывать порядок, в котором они будут работать с итоговым набором данных. Для этого используется конструкция order by .

Пронумеруем строки в нашей таблице в порядке возрастания и убывания дней рождения сотрудников.


Функция row_number возможно является одной из самых часто используемых аналитических функций. Она возвращает номер строки в итоговой выборке. До ее появления в Oracle подобного функционала можно было достичь лишь при использовании подзапросов и псевдостолбца ROWNUM .


Аналитические функции могут работать не только по группам или в определенном порядке, но и в определенном порядке в пределах заданной группы:

Здесь нумерация производится отдельно для каждой группы. У двух сотрудников с одинаковой должностью нумерация была проставлена в порядке их дней рождения.

Диапазон работы аналитических функций

Аналитические функции всегда, явно или неявно, применяются к определенному набору строк, называемому окном аналитической функции.

Не во всех аналитических функциях можно указывать окно. Среди самых часто используемых функций, для которых можно указывать окно, находятся MIN , MAX , SUM , AVG , COUNT , LAST_VALUE , FIRST_VALUE и другие.

Чтобы примеры были немного более практичными, создадим еще одну таблицу, в которой будем хранить данные о начисленных зарплатах сотрудникам по месяцам:

Общие данные выглядят следующим образом:


Теперь добавим колонку к выборке, которая будет показывать, как изменялась минимальная заработная плата сотрудников с течением времени.


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


Чуть позже станет понятно, что это 2 совершенно разных запроса, а пока разберем подробнее различные варианты указания окна в аналитических функциях.

Строки и значения

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

Вторым возможным способом определения окна является определение не по физическому расположению строки в выборке, а по значениям, которые строки в себе содержат. Мысленно это можно произнести: "Для текущей строки в выборке аналитическая функция должна обработать те строки, в которых значение колонки А будет больше, чем значение в колонке А текущей строки"; или: "Для текущей строки в выборке аналитическая функция должна обработать те строки, в которых значение колонки А будет в пределах от 10 до 20 включительно".

В первом случае, при указании физических строк, используется ключевое слово ROWS , во втором случае, при указании строк по их значениям, используется ключевое слово RANGE .

Смещения при определении окна

Итак, при указании окна мы должны задать его верхнюю и нижнюю границу.

В общем виде указание границы выглядит следующим образом:

Теперь рассмотрим варианты для этих границ:

  • UNBOUNDED PRECEDING - указывает, что окно начинается с первой строки в разделе. Может быть указано только для верхней границы, в качестве нижней границы использовать нельзя.
  • UNBOUNDED FOLLOWING - указывает, что окно заканчивается на последней строке в разделе. Может быть указано только для нижней границы.
  • CURRENT ROW - обозначает текущую строку или значение. Может быть использовано как для нижней границы, так и для верхней.
  • PRECEDING - значение в строке или физическая строка, которая предшествует текущей строке на
  • FOLLOWING - значение в строке или физическая строка, которая находится впереди текущей строки на

Следует помнить, что если окно задается с использованием ROWS , т.е. указываются строки, то и границы окна будут задаваться в строках, и наоборот, если используется , то границы окна будут учитываться по значениям в строках.

Если окно не указывается, то по-умолчанию оно имеет вид RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW .

Теперь посмотрим на один из предыдущих запросов:

Рассмотрим, как будет работать аналитическая функция.

PARTITION BY не указан, значит результаты будут "сплошные" и не будут разбиваться по группам. Обрабатываться строки будут в порядке возрастания даты в колонке sal_date , а диапазон строк, для которых будет вычисляться функция, задается первой строкой во всем наборе данных и заканчивается текущей строкой.

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

Еще один важный момент: значения в колонке sal_date не являются уникальными. Это означает, что результат будет недетерминированным, т.е. может отличаться от запуска к запуску, т.к. порядок следования строк в выборке может измениться.

Чтобы избавиться от такого эффекта, можно добавить еще одну колонку в конструкцию order by, чтобы сделать порядок следования строк уникальным и не меняющимся. В данном случае мы можем дополнительно сортировать данные по id сотрудника:

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

  • Функции CUME_DIST , DENSE_RANK , NTILE , PERCENT_RANK и RANK возвращают одинаковый результат для всех строк
  • Функция ROW_NUMBER присвоит каждой строке уникальное значение. Порядок присваивания будет зависеть от порядка обработки строк БД, который мы не можем предугадать
  • Все остальные функции будут работать по-разному в зависимости от спецификации окна. Если окно задавалось при помощи RANGE , то функция вернет одинаковое значение для всех строк. Если использовалось ключевое слово ROWS , то результат нельзя будет предугадать - он опять же будет зависеть от порядка обработки строк базой данных, который может отличаться для одного и того же набора данных от запуска к запуску.

Размеры окна можно задавать в виде смещений:


Здесь в колонке avg_sal считается средняя заработная плата по трем строкам - двум предшествующим и текущей. Порядок следования, как мы помним, задается при помощи ORDER BY, поэтому две предшествующие строки - это строки, у которых значение в колонках sal_date будет меньше либо равным значению в текущей строке.

Значение функции округляется до двух знаков после запятой при помощи функции round . Аналитическая функция берется в скобки полностью, начиная от имени функции и заканчивая определением окна. К значениям, полученным при помощи аналитических функций можно применять другие функции или операторы - например, можно было бы добавить 100 к среднему значению:

Или даже получить разность между значениями двух аналитических функций:

В следующем примере смещение задается не в строках, а в диапазоне значений, которые содержит колонка sal_value:


Т.к. использовался RANGE , то сумма рассчитывается для всех строк, значение которых находится в диапазоне от 1000 до значения в текущей строке.

Еще раз, следует обратить внимание, что строки, которые находятся после текущей, также обрабатываются функцией, если значение колонки sal_value входит в заданный диапазон. Это можно видеть на изображении выше, в строках, где значение sal_value равно 1000 - для первой строки в сумму посчиталось и значение следующей.

Следующий пример считает сумму по четырем строкам - в окно входят 2 предшествующие строки, текущая строка и одна строка, следующая за текущей:


Т.к. окно задавалось с использованием ROWS , сумма считается именно по строкам, а не по их значениям. Для первой строки в сумму были взяты данные из нее самой и следующей, т.к. предыдущих строк у нее нет. Для второй строки была лишь одна предыдущая строка, а у последней не было следующей.

Ограничения на ORDER BY

ORDER BY в аналитических функциях может использоваться только с одной колонкой, за исплючением случаев, когда используется RANGE и окно задается одним из следующих способов:


Пароли, необходимые для доступа к базам данных Oracle, обычно хранятся на серверах базы данных. Администраторов баз данных такой порядок вполне устраивает, однако есть у него и свои недостатки. Если пользователь, скажем, забыл пароль и возникла необходимость его поменять, без администратора никак не обойтись. Или другой пример: синхронизацию паролей Windows и паролей баз данных Oracle можно осуществлять только вручную. А вот в системе Microsoft SQL Server встроенная функция защиты позволяет обеспечивать безопасный доступ к базе данных с помощью имен пользователей и паролей Windows. И когда пользователям нужно переустанавливать свои пароли, администратор SQL Server может поручить выполнение этой задачи сотрудникам службы поддержки.

Windows-аутентификация группы на сервере базы данных

При установке Oracle на сервере Windows система создает группу Windows ORA_DBA и автоматически включает в эту группу учетную запись Windows, использовавшуюся в ходе установки Oracle. Затем администратор базы данных может включить в эту группу других пользователей Windows, которым требуется полный набор привилегий администратора базы данных Oracle. Но нужно действовать осторожно: входящие в группу ORA_DBA локальные и доменные пользователи Windows не обязаны предъявлять пользовательские имена и пароли Oracle. В свойстве Description группы ORA_DBA указывается, что члены группы могут создавать соединения с базой данных Oracle в качестве администраторов базы данных без предъявления паролей.

Для того чтобы база данных Oracle воспринимала пользователей группы ORA_DBA как прошедших процедуру аутентификации, необходимо должным образом сконфигурировать файл sqlnet.ora, показанный на экране 1. В системах Oracle9i и Oracle8i данный файл размещается в папке \%ORACLE_HOME% etworkadmin folder, где %ORACLE_HOME% означает маршрут, используемый при установке серверных компонентов Oracle. Модифицируя файл sqlnet.ora, администратор может указывать, каким образом будут устанавливаться соединения с сервером Oracle.

Параметр NAMES.DIRECTORY_PATH файла sqlnet.ora определяет методы, используемые клиентами Oracle для разрешения псевдонима строки соединения. Например, когда в окне командной строки я ввожу символы

утилита SQL*Plus пытается разрешить псевдоним test9 с помощью записей NAMES.DIRECTORY_PATH в файле sqlnet.ora. Описание средства SQL*Plus, а также информация о том, как его можно получить, содержится во врезке «Программа SQL*Plus для управления Oracle». В соответствии с инструкциями представленного на экране 1 эталонного файла sqlnet.ora, клиент сначала пытается разрешить имя Oracle с помощью текстового файла tnsnames.ora, который размещается либо локально, либо на общем сетевом ресурсе. Если в файле tnsnames.ora данного имени нет, клиент пытается разрешить его через сервер Oracle Names (в настоящее время Oracle рекомендует вместо серверов Oracle Names использовать протокол LDAP — Lightweight Directory Access Protocol). Если же и этот метод не дает результата, клиент пытается разрешить данное имя с помощью метода разрешения имени главной машины, такого как DNS или Network Information Service (NIS).

Параметр SQLNET.AUTHENTICATION_SERVICES файла sqlnet.ora указывает, какую службу аутентификации должна применять база данных Oracle в случае, если пользователь пытается установить соединение с сервером Oracle. По умолчанию системы Oracle9i и Oracle8i активизируют службу аутентификации Windows при наличии следующей настройки:

В системе Windows NT аутентификация всегда осуществляется с помощью диспетчера NT LAN Manager (NTLM). Что же касается систем Windows Server 2003, Windows XP и Windows 2000, то в тех случаях, когда клиентская машина Oracle находится в домене Windows 2003 или Windows 2000, применяется механизм аутентификации Kerberos; в других случаях используется аутентификация NTLM. Стандартную установку, предусматривающую аутентификацию только средствами Windows, нельзя задействовать при работе с приложениями, в которых применяется стандартный метод аутентификации Oracle. И надо сказать, что в прикладных программах многих независимых поставщиков при подключении к системам Oracle применяются стандартные имена пользователей и пароли Oracle. Чтобы иметь возможность пользоваться средствами аутентификации как Oracle, так и Windows, нужно внести в указанный ниже параметр службы аутентификации серверного файла sqlnet.ora следующие изменения:

Любые изменения методов аутентификации могут обернуться потерей соединения. Для выявления подобных сбоев всякий раз при модификации параметра службы аутентификации первым делом следует выполнить с помощью утилиты SQL*Plus базовый тест средств подключения к сети, а затем проверить клиентские приложения Oracle.

Группа ORA_DBA — это группа Windows, поэтому сервер базы данных Oracle обращается к ней лишь в тех случаях, когда служба SQLNET.AUTHENTICATION_SERVICES выполняет процедуру аутентификации средствами Windows. Например, если активизированы средства аутентификации Windows и в окне командной строки вводится

я могу создать привилегированное соединение SYSDBA без предъявления пользовательского имени и пароля Oracle.

Членство в группе ORA_DBA обеспечивает пользователю SYSDBA права доступа ко всем хранящимся на сервере экземплярам Oracle, потому что Windows-группа ORA_DBA владеет ролью Oracle SYSDBA. Роль SYSDBA эквивалентна роли системного администратора (systems administrator, sa) в системе SQL Server. Чтобы предоставлять права доступа с большей степенью детализации, можно создать отдельные группы общего формата ORA_SID_DBA, где SID — это набранный прописными буквами идентификатор Oracle SID, который обеспечивает пользователю SYSDBA права доступа не к определенным базам данных, а к конкретным серверам. Так, в приведенном примере значением идентификатора SID является test9, а это значит, что вы можете создать группу с именем ORA_TEST9_DBA. И теперь все пользователи Windows, которые будут включены в группу ORA_TEST9_DBA, но не войдут в группу ORA_DBA, будут иметь права доступа SYSDBA только к экземпляру базы данных Oracle TEST9.

Подобным же образом можно управлять членством пользователей в группах ORA_OPER и ORA_SID_OPER, которые соответствуют используемой в Oracle роли SYSOPER, чтобы предоставлять привилегии SYSOPER тем или иным пользователям Windows. SYSOPER располагает ограниченным подмножеством привилегий пользователя SYSDBA; аналогичный объем привилегий предоставляется роли db_backupoperator в системе SQL Server.

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

  1. Убедитесь в существовании или создайте соответствующие группы Windows (такие, как ORA_DBA, ORA_SID_DBA, ORA_OPER, ORA_SID_OPER), необходимые для обеспечения требуемого уровня доступа к серверу базы данных Oracle.
  2. Введите пользователей в соответствующие группы.
  3. Позаботьтесь о том, чтобы служба SQLNET.AUTHENTICATION_SERVICES применяла средства Windows (например, NTS) для аутентификации как клиентов, так и серверов.

В системе Oracle предусмотрен графический интерфейс (см. экран 3), предназначенный для добавления пользователей в группы ORA_DBA и ORA_OPER. Если таких групп нет, их можно создать средствами графического интерфейса пользователя. Для обращения к интерфейсу необходимо нажать кнопку Start и в открывшемся списке выбрать элементы All Programs, Oracle — OraHome92, Configuration and Migration Tools, Oracle Administration Assistant for Windows NT. Чтобы добавить пользователя в Windows-группу ORA_OPER, следует щелкнуть правой клавишей мыши на узле OS Database Operators — Computer и в контекстном меню выбрать пункт Add/Remove. Когда на экране появится диалоговое окно OS Database Operators, требуется выбрать нужный домен, затем пользователя, далее щелкнуть на кнопке Add и, наконец, на кнопке OK. Система создаст группу ORA_OPER, если раньше ее не было, и включит в нее указанных пользователей.

Кстати, при выполнении аутентификации средствами Windows нужно иметь в виду следующее обстоятельство: если когда-либо в будущем потребуется воссоздать файл паролей Oracle (в папке \%ORACLE_HOME%database), обратитесь к документации Oracle и проверьте значение настройки REMOTE_LOGIN_PASSWORD в файле init.ora. Как указывается в руководстве Oracle9i Database Administrator?s Guide, значение REMOTE_LOGIN_PASSWORD определяет, как функционирует система аутентификации Oracle, что в свою очередь может повлиять на функционирование приложений, использующих механизм аутентификации Oracle.

Windows-аутентификация на сервере без группы

система возвратит результаты, показанные на экране 4. Причина сбоя в том, что клиент уже не будет пытаться подключиться к базе данных Oracle в качестве члена Windows-группы ORA_DBA. В результате объем полномочий пользователя Windows уже не соотносится автоматически с ролью Oracle через его членство в группе Windows и, следовательно, пользователь не получает авторизации в системе Oracle. Мы не используем членство в группах для аутентификации пользователя, поэтому учетная запись пользователя Windows, WinUser, передается в систему Oracle и проходит авторизацию средствами Oracle. Но Oracle предоставляет пользователю Windows определенный объем полномочий лишь в том случае, если данному пользователю соответствует пользователь Oracle. В нашем примере полностью определенное доменное имя пользователя (Fully Qualified Domain Name, FQDN) — PENTONWinUser. Чтобы этот пользователь Windows мог пройти авторизацию в базе данных Oracle, мы должны создать пользователя Oracle PENTONWinUser. Когда пользователю Windows соответствует пользователь Oracle, объем полномочий, предоставляемых данному пользователю Windows, соответствует объему полномочий определенного пользователя Oracle. При создании пользователя Oracle необходимо, чтобы имя FQDN состояло только из прописных букв и было заключено в двойные кавычки, как в приведенном ниже примере. С помощью SQL*Plus или другого клиентского инструмента мы можем подключиться к базе данных Oracle с полномочиями SYSDBA и выполнить следующие команды:

В системе Oracle предусмотрен параметр, оказывающий влияние на то, как Oracle устанавливает соответствие между именем пользователя Windows и именем пользователя Oracle. Он применяется в ситуациях, когда членство пользователя в группах Windows не указывается. В ранних версиях Oracle использовался префикс OPS$, который ставился перед именем пользователя Oracle, применяемого во внешней аутентификации. Имена пользователей в Oracle могут состоять не более чем из 30 знаков, поэтому применение префикса OPS$, в сущности, ограничивало длину имени пользователя до оставшихся 26 знаков. Чтобы не пришлось использовать префикс OPS$, содержащий параметры базы данных Oracle, файл init.ora (который хранится в папке \%ORACLE_HOME%database) должен содержать следующую настройку (она создается по умолчанию при установке систем Oracle9i и Oracle8i):

Этот параметр используется для обеспечения обратной совместимости. Oracle не рекомендует добавлять к именам префиксы, поэтому и используется приведенный выше стандартный «пустой» параметр. Чтобы система начала применять измененный параметр OS_AUTHENT_PREFIX, необходимо остановить и вновь инициализировать экземпляр базы данных Oracle.

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

Аутентификация удаленных клиентов Windows

Надо отметить, что аутентификацией клиентов Windows, использующих средства аутентификации Windows для доступа к функционирующему в той же сети удаленному серверу Oracle, операционная система этого сервера не занимается. Процедура аутентификации таких пользователей выполняется операционными системами клиентов. Чтобы активизировать средства дистанционной аутентификации, нужно в файл init.ora для данного экземпляра базы данных добавить указанную ниже запись, после чего остановить и вновь запустить базу данных:

В Oracle не рекомендуется прибегать к дистанционной аутентификации, поскольку она не обеспечивает защиты от спуфинга учетных данных пользователей. Предположим, к примеру, что в домене PENTON имеется легитимный пользователь Windows с именем WinUser. Далее на том же сервере мы с помощью приведенной ниже синтаксической конструкции создаем пользователя Oracle и активизируем средства дистанционной аутентификации:

Теперь представьте себе, что может произойти, если к сети подключится хакерская машина с именем PENTON. Злоумышленник может создать на своей машине локального пользователя Windows с именем WinUser, и этот пользователь будет проходить процедуру аутентификации под именем PENTONWinUser. Далее имя данного пользователя может быть передано на сервер Oracle как PENTONWinUser. Сервер Oracle не сумеет отличить доменное имя PENTON от имени PENTON, присвоенного хакерской машине, поэтому, выполняя процедуру дистанционной аутентификации, он подтвердит полномочия машины злоумышленника. По представлениям сервера Oracle, PENTONWinUser относится к категории пользователей, поэтому он наделяет этого пользователя всем объемом полномочий, причитающихся PENTONWinUser. Если доступ к сети могут получать посторонние клиентские машины, это означает, что средства дистанционной аутентификации Windows открывают среду баз данных для несанкционированного доступа.

Знакомая модель

Программа SQL*Plus для управления Oracle

SQL*Plus — утилита, позволяющая формировать запросы, модифицировать объекты базы данных Oracle и манипулировать ими, а также выполнять операции по обслуживанию баз данных. SQL*Plus инсталлируется по умолчанию при установке сервера Oracle. По набору функций версия программы с командной строкой напоминает утилиту Osql системы SQL Server. Для запуска этой версии SQL*Plus необходимо ввести в окне командной строки:

Читайте также: