Oracle как узнать кто держит пакет

Обновлено: 06.07.2024

Икру люблю и черную и красную, но к сожалению натуральную, и действительно вкусную в наше время.

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

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

Если у вас есть домашний любимец и мы заметили что с ним что-то не так, а времени у вас нет.

Я всегда обращаюсь к этим ребятам так как они качественно делают свою работу.

Как сменить пароль по умолчанию для схемы SYSTEM c 'manager' на свой? То же и для SYS

Подскажите, есть ли в PL\SQL команда, определяющая операционную систему?

Собственно, сабж :), касаемо ооочень большого предприятия. Помогите с аргументацией.

Народ. помогите лентяю - где можно накачть документацию по Oracle (не ниже 8i) на русском.

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

при использовании TO_CHAR(volume), где volume - NUMBER, если целая часть числа равна 0 (например.

делаю запрос "SELECT Column1 FROM Table1 WHERE nameid=123456" я не знаю сколько будет.

Приветствую Знающих! проскажите пожалуйста как составить sql запрос выводящий список.

Есть поле типа BLOB, в котором храниться документ в формате PDF. Необходимо извлечь данные из.

Периодически на сервере процесс Oracle грузит процессор на 100% на длительное время. В.

Добрый день! Столкнулась с такой проблемой при работе с OLAP-кубами в Excel с установленной.

После установки Oracle 8.1.7 на Windows 2000 сервере (Whistler) пытаюсь создать БД с помощью.

Очень, очень, очень, очень, очень, очень, очень не удобно сделаны комменты у вас! они нужны.

Помогите начать! Установил Oracle9i, при попытке войти в SQL*Plus запрашивает логин и пароль.

Помогите, пожалуйста, советами. С базой нельзя соединиться, возникает ora-01033. В логах.

это что издевательство такое? Oracle 7? где вы его сейчас увидите? Фильтруйте хоть немного.

Как-то не кажется, что это так "наболело". Можно было бы привести более серьёзный примерчик.

У меня Oracle 9i. Скачал на днях Designer. Поставил. При попытке запуска (des2k61.exe.

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

С помощью пакета DBMS_JOB создается JOB c указанием NEXT_DATE (даты запуска) и интервалом null.

у меня ест таблица имеющая тип BLOB и файлы хранящийся в этой таблице. Подскажите как из этой.

не как не пойму как скачать на официальном сайте Oracle Database 10g Express Edition .может кто.

Какие могут быть ошибки при установке Oracle на Windows 7 [64

Всем привет, подскажите пожалуйста как правильно установить Оракл на Линукс, может быть есть.

Доброго времени суток. У меня такая проблема: есть три таблицы: Заявка_на_недвижимость, Документ.

Добрый день! Ситуация следующая: при запуске формы происходит замена текущей схемы (alter.

Система Solaris 5.9, устанавливаем Oracle 9.0.2.1 После установки и отработке netca.

Люди добрые! Подмогните кто чем может! Сервер под Win 2003, поставил DB Oracle 10g. Вроде все.

Как с правами администратора прослеживать SQL-запросы выполненные DB Oracle 10g ?

Ошибка "/ вместо |" Есть: Сохраним и закроем файл. Затем импортирем ключ GPG: $ wget.

Процедура находится в пакете pac1 В этом пакете объявлен тип: type cur is ref cursor. В этом.

Мы создаем инструментальное средство разработки баз данных Oracle - 'Database Voyager'. Ввиду.

помогите пожалуйста! Мне надо написать курсовую по СУБД Oracle. Даже не знаю с чего начать.

Помогите новичку разобраться с инсталляцией. Есть оракл 9 на 3-х дисках. На первом диске -.

Помогите пожалуйста, не удается инсталлировать OracleClient 8 (8.1.7). Жмешь на Setup.exe и.

После патча Оракла 8.1.7.0.0 до 8.1.7.4.1 перестал выполняться export В чем проблема, помогите.

Подскажите, можно ли в уже имеющейся базе изменить настройки разделителя целой/дробной части.

Кто нибудь ставил mod_owa под Unix (Solaris)? Поделитесь опытом, плиз.

Мне кажется, что нужно использовать аналитические функции : create table T_CURRENCY ( CODE .

Здравствуйте, при запуске PLSQL Developer выдаёт следующую ошибку: ORA-12560: TNS:ошибка.

Есть такое понятие как исходный код пакета, а есть его откомпиленная версия.

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

1) для выполнения процедуры ALTER (изменение исходника пакета) требуется эксклюзивная сессия.
При выполнении пакета работает shared-сессия.


> Petr V. Abramov © (23.05.12 23:01) [8]
> а в чем проблема перекомпилить-то.

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

SQL> create table uuu (id number);

Package body created

SQL> exec ptmp.do_smth;

PL/SQL procedure successfully completed

SQL> alter package ptmp compile;

+ ко всему, придется раскручивать всё дерево зависимости этого пакета и делать revoke для всех зависящих от данного пакетов.

alter package ptmp compile; - что же она тогда делает?

Создание / изменение ИСХОДНОГО кода пакета / процедуры / функции не приводит по-умолчанию к компиляции. Скомпилированное тело помечается как INVALID до первого вхождения, когда оно компилируется.

- Создайте пакет с помощью create or replace. Скомпильте его или используйте хотя бы один раз
- далее измените код пакета с помощью create or replace. Вот и всё.

Во втором случае АВТОМАТИЧЕСКОЙ компиляции не будет. Исходный код пакета будет ОТЛИЧАТЬСЯ от скомпилированной версии, которая будет помечена ошибочной (ну или там требующей перекомпила, смотря как интерпретировать).

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

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

alter package ptmp compile;

Я участвую в бакалавриате, и у меня нет особых проблем при предоставлении прав собственности пользователю 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 позволит пользователю передавать свои права другим аккаунта. Оракл хранит информацию о том кто и кому дал доступ на объектном уровне; это позволяет отзывать права учитывая эту информацию. Рассмотрим пример

Работа с данными пакета (package) PL/SQL

Данные пакета PL/SQL состоят из переменных и констант, определенных на уровне пакета, а не в конкретной его функции или процедуре. Их областью видимости является не отдель­ная программа, а весь пакет. Структуры данных пакета существуют (и сохраняют свои значения) на протяжении всего сеанса, а не только во время выполнения программы. Если данные пакета объявлены в его теле, они сохраняются в течение сеанса, но до­ступны только элементам пакета (то есть являются приватными).

Если данные пакета объявлены в его спецификации, они также сохраняются в те­чение всего сеанса, но их чтение и изменение разрешено любой пользовательской программе, обладающей привилегией EXECUTE для пакета. Общие данные пакета похожи на глобальные переменные Oracle Forms (а их использование сопряжено с таким же риском).

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

Глобальные данные в сеансе Oracle

В среде PL/SQL структуры данных пакета функционируют как глобальные. Однако следует помнить, что они доступны только в пределах одного сеанса или подключения к базе данных Oracle и не могут совместно использоваться несколькими сеансами. Если доступ к данным нужно обеспечить для нескольких сеансов Oracle, используйте пакет DBMS_PIPE (его описание имеется в документации Oracle Built-In Packages).

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

Допустим, приложение Oracle Forms сохранило значение в пакетной структуре данных. Когда форма вызывает хранимую процедуру, эта процедура может обращаться к тем же пакетным переменным и значениям, что и форма, потому что они используют одно подключение к базе данных. Но допустим, форма генерирует отчет с использованием Oracle Reports. По умолчанию Oracle Reports создает для отчета отдельное подключе­ние к базе данных с тем же именем пользователя и паролем. Даже если отчет обратится к тому же пакету и структурам данных, что и форма, значения, хранимые в структурах данных, доступных форме и отчету, будут разными, поскольку сеанс отчета имеет свой экземпляр пакета и всех его структур.

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

Глобальные общедоступные данные

Любая структура данных, объявленная в спецификации пакета, является глобальной общедоступной структурой данных; это означает, что к ней может обратиться любая

программа за пределами пакета. Например, вы можете определить коллекцию PL/ SQL в спецификации пакета и использовать ее для ведения списка работников, заслу­живших повышение. Вы также можете создать пакет с константами, которые должны использоваться во всех программах. Другие разработчики будут ссылаться на пакетные константы вместо использования фиксированных значений в программах. Глобальные общедоступные структуры данных также могут изменяться, если только они не были объявлены с ключевым словом CONSTANT .

Глобальные данные обычно считаются источником повышенной опасности в програм­мировании. Их очень удобно объявлять, они прекрасно подходят для того, чтобы вся информация была доступна в любой момент времени — однако зависимость от глобаль­ных структур данных приводит к созданию неструктурированного кода с множеством побочных эффектов.

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

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

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

Пакетные курсоры

Одним из самых интересных типов пакетных данных является явный курсор PL/SQL. Его можно объявить в теле либо в спецификации пакета. Состояние курсора (открыт или закрыт), а также указатель на его набор данных сохраняются в течение всего сеанса. Это означает, что открыть пакетный курсор можно в одной программе, выбрать из него данные — в другой, а закрыть — в третьей. Такая гибкость курсоров предоставляет большие возможности, но в то же время она может стать источником проблем. Сначала мы рассмотрим некоторые тонкости объявления пакетных курсоров, а затем перейдем к открытию, выборке данных и закрытию таких курсоров.

Объявление пакетных курсоров

Явный курсор в спецификации пакета можно объявлять двумя способами:

  • Полностью (заголовок курсора и запрос). Именно так объявляются курсоры в ло­кальных блоках PL/SQL .
  • Частично (только заголовок курсора). В этом случае запрос определяется в теле пакета, поэтому реализация курсора скрыта от использующего пакет разработчика. При использовании второго способа в объявление нужно добавить секцию RETURN , ука­зывающую, какие данные будут возвращены при выборке из курсора. На самом деле эти данные определяются инструкцией SELECT , которая присутствует только в теле, но не в спецификации

В секции RETURN можно задать одну из следующих структур данных:

  • О запись, объявленная на основе таблицы базы данных с использованием атрибута %rowtype ;
  • О запись, определенная программистом.

Объявление курсора в теле пакета осуществляется так же, как в локальном блоке PL/ SQL . Следующий пример спецификации пакета демонстрирует оба подхода:

Логика программы описана в следующей таблице.

Строки Описание
3-9 Типичное определение явного курсора, полностью заданное в спецификации пакета
11-13 Определение курсора без запроса. Спецификация указывает, что открыв курсор и выбрав
из него данные, пользователь получит одну строку из таблицы books под действием заданного фильтра
15-18 Определение нового типа записи для хранения информации об авторе
20-22 Объявление курсора, возвращающего сводную информацию о заданном авторе (всего три
значения)

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

Работа с пакетными курсорами

Теперь давайте посмотрим, как пользоваться пакетными курсорами. Прежде всего для открытия, выборки данных и закрытия вам не придется изучать новый синтаксис — нужно только задать имя пакета перед именем курсора. Например, чтобы запросить информацию о книгах по PL/SQL, можно выполнить такой блок кода:

Как видите, на основе пакетного курсора точно так же можно объявить переменную с использованием %ROWTYPE и проверить атрибуты. Ничего нового!

Однако и в этом простом фрагменте кода есть скрытый нюанс. Поскольку курсор объ­явлен в спецификации пакета, его область видимости не ограничивается конкретным блоком PL/SQL . Предположим, мы выполняем следующий код:

Дело в том, что блок, выполненный первым, не закрыл курсор, и по завершении его работы курсор остался открытым.

При работе с пакетными курсорами необходимо всегда соблюдать следующие правила:

  • Никогда не рассчитывайте на то, что курсор закрыт (и готов к открытию).
  • Никогда не рассчитывайте на то, что курсор открыт (и готов к закрытию).
  • Всегда явно закрывайте курсор после завершения работы с ним. Эту логику также необходимо включить в обработчики исключений; убедитесь в том, что курсор за­крывается на всех путях выхода из программы.

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

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

В этом фрагменте не используются явные вызовы OPEN и CLOSE . Вместо них вызываются соответствующие процедуры, скрывающие особенности работы с пакетными курсорами.

Можно взглянуть на ситуацию под другим углом:

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

Пакетное создание курсоров и предоставление доступа к ним всем разработчикам, участвующим в проекте, приносит большую пользу. Проектирование оптимальных структур данных приложения — непростая и кропотливая работа. Эти структуры — и хра­нящиеся в них данные — используются в программах PL/SQL, а работа с ними почти всегда осуществляется через курсоры. Если вы не определите свои курсоры в пакетах и не предоставите их «в готовом виде» всем разработчикам, то каждый будет писать собственную реализацию курсора, а это создаст массу проблем с производительностью и сопровождением кода. Пакетные курсоры являются лишь одним из примеров инкап­суляции доступа к структурам данных.

Повторно инициализируемые пакеты

По умолчанию пакетные данные сохраняются в течение всего сеанса (или до переком­пиляции пакета). Это исключительно удобное свойство пакетов, но и у него имеются определенные недостатки:

  • Постоянство глобально доступных (общих и приватных) структур данных сопро­вождается нежелательными побочными эффектами. В частности, можно случайно оставить пакетный курсор открытым, а в другой программе попытаться открыть его без предварительной проверки, что приведет к ошибке.
  • Если данные хранятся в структурах уровня пакетов, то программа может занять слишком большой объем памяти, не освобождая ее.

Для оптимизации использования памяти при работе с пакетами можно использовать директиву SERIALLY_REUSABLE . Она указывает Oracle, что пакет является повторно инициализируемым, то есть его состояние (состояние переменных, открытых пакетных курсоров и т. п.) нужно сохранять не на протяжении сеанса, а на время одного вызова пакетной программы.

Рассмотрим действие этой директивы на примере пакета book_info . В нем имеются две отдельные программы: для заполнения списка книг и для вывода этого списка.

Как видно из приведенного ниже тела пакета, список объявляется как приватный гло­бальный ассоциативный массив:

Чтобы увидеть, как работает эта директива, заполним список и выведем его на экран. В первом варианте оба шага выполняются в одном блоке:

Заполнение и вывод в одном блоке:

Во второй версии заполнение и вывод списка производятся в разных блоках. В резуль­тате коллекция окажется пустой:

Заполнение в первом блоке

Вывод во втором блоке:

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

Шесть тысяч слов помогут вам понять статистику Oracle и план выполнения

Источник | JiekeXu Road (ID: JiekeXu_IT)

Свяжитесь с авторизацией для перепечатки | (WeChat ID: xxq1426321293)

Всем привет, я JiekuXu, я очень рад снова встретиться с вами, поделитесь этим сегодня Статистика Oracle и план выполнения. Эта статья была впервые опубликована в общедоступном аккаунте WeChat [JiekeXu Road], пожалуйста, нажмите на синюю букву выше, чтобы подписаться на меня!

Предисловие

Несколько дней назад я получил приглашение от г-на Ян Цзяньжун, автора «Рабочих заметок Oracle DBA» и «MySQL DBA Work Notes» и соучредителя сообщества DBAplus на WeChat, и сказал, что поделится технической, на рабочем месте и идеи в его группе QQ От таких статей я сразу почувствовал искренность и ужас.Мне было честью, что обмен опытом - это тоже процесс обучения, поэтому я с радостью согласился на приглашение Учителя Яна. Думая, что вы также изучаете в последнее время вещи, связанные с оптимизацией, вы можете обобщить и поделиться во время обучения.Если в статье есть другие недостатки, сообщите об этом.

1. Статистика

Статистическая информация в основном описывает тип информации, такой как размер, масштаб и статус распределения данных таблиц и индексов в базе данных. Например, количество строк в таблице, количество блоков, средний размер каждой строки, листовые блоки индекса, количество строк в индексном поле и размер различных значений являются статистическими. Информация. Начиная с Oracle11G, автоматический сбор статистики базы данных был интегрирован в задачи автоматического обслуживания, которые в основном выполняются автоматически по умолчанию, что также в большинстве случаев соответствует требованиям эксплуатации, но также может быть собрано вручную.Поговорим об этом вместе.

Использоватьgather_stats_job Автоматический сбор данных создается автоматически, когда база данных создается и управляется планировщиком. Он собирает статистику для всех объектов в базе данных, для которых отсутствует или устаревшая статистика оптимизатора.

Использоватьdbms_stats Пакет вручную собирает системную статистику.

Просмотр статуса задач автоматического сбора статистики

Имя задачи автоматического сбора статистической информации в oracle 11g - автоматический сбор статистики оптимизатора. Окно времени выполнения по умолчанию для автоматических задач в 11g (введение в временное окно Oracle):

С понедельника по пятницу начинается в 22:00 и заканчивается в 14:00.

Выходные - шесть часов утра и продолжаются 20 часов.

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


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

- Остановить и запустить отдельную задачу (то есть остановить задачу в определенный день)

Связанные просмотры:

Вот и все, что касается автоматического сбора. Для получения дополнительной информации проверьте официальные документы или Doc ID 1300313.1
How to Create an Own Maintenance Window for Autotask Jobs in 11g (Doc ID1300313.1) . Позволь мне поговорить об этом dbms_stats Связанный с пакетом.

dbms_stats

Пакет DBMS_STATS в основном предоставляет методы для сбора (сбора), удаления (удаления), экспорта (экспорта), импорта (импорта) и изменения (установки) статистической информации. Говоря оdbms_stats Тогда нужно поговорить о команде анализа.

Разница между dbms_stats и анализировать: Dbms_stats - это пакет, используемый для сбора статистики в Oracle9i и более поздних версиях.Хотя команда анализа была всегда доступна, больше не рекомендуется использовать команду анализа для сбора статистики. Вместо этого используйте dbms_stats. Между ними существует большая разница. Dbms_stats может правильно собирать статистику таблицы разделов, что означает, что он может собирать глобальную статистику, в то время как анализ может собирать статистику только объектов нижнего уровня, а затем выводить и суммировать более высокие -уровневые объекты.Статистика: если таблица разделов собирает только статистику разделов, то суммирует статистику всех разделов, чтобы получить статистику на уровне таблицы. По сути, Analyze устарел. Он использовался более семи или восьми лет назад. Oracle и эксперты рекомендуют пакет dbms_stats.

Пакет dbms_stats может собирать статистику о базах данных, словарях данных, индексах, таблицах и т. Д.


dbms_stats.gather_table_ststs параметр

1、 cascade:

true: указывает, что статистика собирается вместе с индексом при подсчете

2、 no_invalidate:

true: после сбора статистики исходный план выполнения не становится недействительным.

false: после сбора статистики исходный план выполнения становится недействительным.

По умолчанию DBMS_STATS.AUTO_INVALIDATE, Oracle решает, когда сделать недействительным план выполнения.

3、 method_opt:

FOR ALL [INDEXED | HIDDEN] COLUMNS[size_clause]

FOR COLUMNS [size clause] column[size_clause] [,column [size_clause]. ]

Когда данные поля распределены неравномерно, создайте гистограмму (гистограмму):

Статистика гистограммы: значения столбца индексного поля для создания статистики

Многоколоночная статистика: статистика создания столбца составного индекса

Статистика выражений: создание статистики по клавишам индекса функций

Примечание. Случай двух приведенных выше строк отличается, при использовании exec его нужно записать в одну строку. Анонимные блоки могут быть записаны в несколько строк. Кроме того, значение Size равно 1-254, но после 12c значение становится 1-2048.

Просмотр статистики:


Примечание. Обычные пользователи могут проверить user_tab_col_statistics, а пользователи DBA могут проверить dba_tab_col_statistics. Конечно, вы также можете использовать dba_tab_statistics для просмотра времени последнего сбора статистической информации.


Вот и все статистические данные, давайте перейдем к сегодняшней теме: План реализации 。

2. План реализации

План выполнения: описание пути доступа или процесса выполнения оператора SQL в базе данных.Oracle через оптимизатор Optimizer (Оптимизатор здесь относится к оптимизатору на основе затрат [Cost Based Optimizer, CBO]) для поиска оптимального плана выполнения для выполнения. Затем мы сначала понимаем, как выполняется следующий SQL: обычно он проходит через три этапа: синтаксический анализ (Parse), выполнение (Execute) и получение (Fetch), которые выполняются различными компонентами Oracle. Подробная информация должна быть быть объясненным из архитектуры Oracle. Я не буду говорить об этом здесь.


rowsource Источник строки: в запросе подходящим набором данных, возвращенным предыдущей операцией, может быть вся таблица или ее часть.Конечно, также можно выполнить операцию соединения для двух таблиц. Что касается жесткого анализа, можно просмотреть мягкий анализПредыдущая статья。

В-третьих, просмотрите план выполнения

Часть SQL выполняется в базе данных и возвращает результат. Что происходит в середине и какие пути были доступны. Это требует проверки плана выполнения. Оптимизатор выберет наиболее разумный и наиболее эффективный метод выполнения, который, по его мнению, является наиболее разумный и эффективный метод выполнения для выполнения возврата SQL.Набор результатов предоставляется клиенту, поэтому давайте взглянем на общие методы проверки плана выполнения, включая, помимо прочего, следующие семь методов.

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