Что такое код dba_exists

dba_exists

(PHP 3>= 3.0.8, PHP 4)

dba_exists — проверяет, существует ли ключ.

Описание

bool dba_exists (string key, resource handle)

dba_exists() проверяет, существует ли специфицированный key в БД, специфицированной в handle.

Key это ключ, который проверяется.

Handle это дескриптор БД, возвращаемый функцией dba_open().

dba_exists() возвращает TRUE или FALSE, если ключ найден или нет, соответственно.

Различие между «SYSDBA», «SYSOPER» и «DBA» в базе данных Oracle

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

SYSDBA и SYSOPER – это специальные привилегии администратора, которые позволяют выполнять базовые задачи администрирования: запуск или остановка истанса; создание, удаление, открытие или монтирования базы и др. Роль DBA не включает SYSDBA или SYSOPER.

О системной привилегии SYSDBA

Привилегии SYSDBA и SYSOPER позволяют получать доступ к базе данных, даже если база не открыта. Контроль этих привилегий находится за пределами компетенции самой базы данных. SYSDBA и SYSOPER могут также быть расценены как тип подключения, который позволяет выполнять определённые операции для которых привилегии не могут быть назначены другим способом.

Обзор возможностей каждой из привилегий:

SYSDBA:

  • Выполнять STARTUP и SHUTDOWN операции
  • ALTER DATABASE: open, mount, back up, or change character set
  • CREATE DATABASE
  • DROP DATABASE
  • CREATE SPFILE
  • ALTER DATABASE ARCHIVELOG
  • ALTER DATABASE RECOVER
  • Включает привилегию RESTRICTED SESSION
  • ALTER DATABASE RECOVER
  • Позволяет подключаться как пользователь SYS

SYSOPER:

  • Выполнять STARTUP и SHUTDOWN операции
  • CREATE SPFILE
  • ALTER DATABASE OPEN/MOUNT/BACKUP
  • ALTER DATABASE ARCHIVELOG
  • ALTER DATABASE RECOVER (Только полное восстановление. Другие формы восстановления, такие как UNTIL TIME|CHANGE|CANCEL|CONTROLFILE требуют SYSDBA.)
  • Включает привелегию RESTRICTED SESSION
  • Позволяет выполнять базовые операции, но без возможности просмотра данных пользователя

Если подключаться с привилегией SYSOPER или SYSDBA, то вы будете ассоциированы со схемой по умолчанию для данной привилегии, а не с той, которая была назначена пользователю.
Схема по умолчанию для SYSDBA: SYS
Схема по умолчанию для SYSOPER: PUBLIC

Выборка пользователей, которые имеют SYSDBA или SYSOPER привилегии:

SQL>column sysdba format a10
SQL>column sysdba format a10
SQL>select * from v$pwfile_users;
USERNAME SYSDBA SYSOPER
———- ——– ———-
SYS TRUE TRUE
SCOTT TRUE FALSE

О DBA роли

Роль DBA – это предопределённая роль, которая автоматически создаётся для каждой базы данных Oracle. Эта роль содержит все системные привилегии, кроме SYSDBA и SYSOPER. Поэтому она очень мощная и должна назначаться только администраторам, которым требуется полный доступ.

Выборка всех ролей с базы данных:

SQL> select role from dba_roles;
ROLE
———–
CONNECT
RESOURCE
DBA
…..

Выборка всех пользователей, которым назначена DBA роль:

SQL>select * from dba_role_privs where granted_role = ‘DBA’
GRANTEE GRANTED_ROLE ADM DEF
———– ——————- —– ——
SYS DBA YES YES
SYSMAN DBA NO YES
LETS DBA NO YES
SYSTEM DBA YES YES

Замечание: вы не можете назначить привелегию SYSDBA для роли. Это приводит к ошибке:
ORA-01931: cannot grant SYSDBA to a role

Для пользователя базы данных могут быть назначены роль DBA и привилегия SYSDBA:

SQL> select * from dba_role_privs where granted_role = ‘DBA’
GRANTEE GRANTED_ROLE ADM DEF
———- ——————- —— —–
SYS DBA YES YES
SCOTT DBA NO YES
SYSMAN DBA NO YES
LETS DBA NO YES
SYSTEM DBA YES YES

Литература: Oracle® Database Administrator’s Guide

Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.

Операторы EXISTS и NOT EXISTS

Новосибирская государственная академия экономики и управления

ЛАБОРАТОРНЫЙ ПРАКТИКУМ ПО ДИСЦИПЛИНЕ

«БАЗЫ ДАННЫХ»

Лабораторная работа N 7

«Язык баз данных SQL: команды манипуляции данными»

НОВОСИБИРСК 2000

SQL – это сокращенное название языка структурированных запросов (Structured Query Language). Из названия языка понятно, что его основное назначение заключается в формировании запросов на получение информации из базы данных. Команды на выборку данных составляют основу языка манипулирования данными DML — составной части языка SQL. Однако DML состоит не только из команд выборки данных из базы. Существуют также команды модификации данными, управления данными и другие.

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

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

Для выполнения лабораторной работы требуется знание основ реляционной модели данных, основ реляционной алгебры и реляционного исчисления, принципов работы с СУБД MS SQL Server.

В результате выполнения лабораторной работы Вы освоите способы манипулирования данными с помощью команд языка SQL, рассмотрите диалект языка, реализованный в СУБД MS SQL Server.

ВВЕДЕНИЕ

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

Первоначально структура синтаксиса SQL была основана (или, по крайней мере, казалась основанной) на реляционном исчислении Кодда. Единственной поддерживаемой операцией реляционной алгебры было объе­динение.

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

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

Простые запросы

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

Простой запрос. Запрос, который обращается только к одной таблице базы данных.

Запрос: Кто работает штукатурами?

WHERE SKILL_TYPE = ‘Штукатур’

Результат:

Этот запрос иллюстрирует три наиболее часто встречающиеся фразы SQL: SELECT, FROM и WHERE. Хотя в нашем примере мы поместили их на разные строки, они все могут стоять в одной строке. Они также могут поме­щаться с разными отступами, а слова внутри фраз могут разделяться произ­вольным числом пробелов. Рассмотрим характеристики каждой фразы.

Select. Фраза SELECT перечисляет столбцы, которые должны войти в результирующую таблицу. Это всегда столбцы некоторой реляционной таб­лицы. В нашем примере результирующая таблица состоит из одного столбца (NAME), но в общем случае она может содержать несколько столбцов; она также может содержать вычисленные значения или константы. Мы приве­дем примеры каждого из этих вариантов. Если результирующая таблица должна содержать более одного столбца, то все нужные столбцы перечисля­ются после команды SELECT через запятую. Например, фраза SELECT WORKER_ID, NAME выдаст в результате таблицу, состоящую из столбцов WORKER_ID и NAME.

Фраза SELECT. Задает столбцы результирующей таблицы.

From. Фраза FROM задает одну или более таблиц, к которым обраща­ется запрос. Все столбцы, перечисленные во фразах SELECT и WHERE, должны существовать в одной из таблиц, перечисленных в команде FROM. В SQL2 эти таблицы могут быть напрямую определены в схеме как базовые таблицы или представления данных, или же они сами могут быть не имею­щими имен таблицами, полученными в результате запросов SQL. В послед­нем случае запрос явно приводится в команде FROM.

Фраза FROM. Задает существующие таблицы, к которым обращается запрос.

Where. Фраза WHERE содержит условие. на основании которого выби­раются строки таблицы (таблиц). В нашем примере условие состоит в том, что столбец SKILL_TYPE должен содержать константу ‘Штукатур’, заклю­ченную в апострофы, как это всегда делается с текстовыми константами в SQL. Фраза WHERE — наиболее изменчивая команда SQL; она может со­держать множество разнообразных условий. Большая часть нашего изложе­ния будет посвящена иллюстрации различных конструкций, разрешенных в команде WHERE.

Фраза WHERE.Задает условие, на основании которого выбираются строки из заданных таблиц.

Приведенный выше запрос SQL обрабатывается системой в следующем порядке: FROM, WHERE, SELECT. To есть строки таблицы, указанной в ко­манде FROM, помещаются в рабочую область для обработки. Затем к каждой строке последовательно применяется фраза WHERE. Все строки, не удовле­творяющие условию WHERE, исключаются из рассмотрения. Затем те строки, которые удовлетворяют условию WHERE, обрабатываются командой SELECT. В нашем примере из каждой такой строки выбирается NAME, и все выбранные значения выводятся в качестве результатов запроса.

Илон Маск рекомендует:  Что такое код mb_ereg_search_getpos

Запрос: Привести все данные о зданиях офисов.

WHERE TYPE = ‘Офис’

BLDG IDАДРЕСTYPEQLTY LEVELSTATUS

312 Ул.Вязов, 123 Офис 2 2

210 Березовая ул. 1011 Офис З 1

111 Осиновая ул. 1213 Офис 4 1

Звездочка (*) в команде SELECT означает «строка целиком». Это удобное сокращение, которым мы будем часто пользоваться.

Запрос: Какова недельная зарплата каждого электрика?

SELECT NAME, ‘Недельная зарплата = ‘, 40 * HRLY_RATE

WHERE SKILL_TYPE = ‘Электрик’

Результат:

М.Фарадей Недельная зарплата = 500.00

Х.Колумб Недельная зарплата = 620.00

Этот запрос иллюстрирует употребление и символьных констант (в на­шем примере ‘Недельная зарплата = ‘), и вычислений в команде SELECT, Внутри команды SELECT можно производить вычисления, в которых ис­пользуются числовые столбцы и числовые константы, а также стандартные арифметические операторы (+, -, *, /), сгруппированные по мере необходи­мости с помощью скобок. Мы также включили новую команду ORDER BY, которая сортирует результат запроса в возрастающем алфавитно-числовом порядке по указанному столбцу. Если вы хотите упорядочивать результаты по убыванию, то к команде нужно добавить DESC. Фраза ORDER BY может сортировать результаты по нескольким столбцам, по одним — в порядке возрастания, по другим — в порядке убывания. Первым указывается столбец первичного ключа сортировки.

Символьная константа. Константа, состоящая из букв, цифр и «специальных» символов.

Запрос: У кого почасовая ставка от 10 до 12 долларов?

WHERE HRLY_RATE > = 10 AND HRLY_RATE (не равно), , =). Для создания составных условий или для отрицания условия могут использо­ваться булевы операции AND (И), OR (ИЛИ) и NOT (HE). Для группировки условий, как обычно в языках программирования, могут использоваться скобки.

Операторы сравнения =, <>, , =.

Булевы операцииAND (И), OR (ИЛИ) и NOT (HE).

Для формулировки этого запроса также можно былоиспользоватьоператор BETWEEN (между):

WHERE HRLY_RATE BETWEEN 10 AND 12

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

Запрос: Перечислить штукатуров, кровельщиков и электриков.

WHERE SKILL_TYPE IN (‘Штукатур’, ‘Кровельщик’, ‘Электрик’)

WORKER_ID NAME HRLY_RATE SKILL_TYPE SUPV_ID

1235 М.Фарадей 12.50 Электрик 1311

1412 К.Немо 13.75 Штукатур 1520

2920 Р.Гаррет 10.00 Кровельщик 2920

1520 Г.Риковер 11.75 Штукатур 1520

1311 Х.Колумб 15.50 Электрик 1311

Этот запрос поясняет использование оператора сравнения IN (В). Усло­вие WHERE считается истинным, если тип специальности строки располо­жен внутри множества, указанного в скобках, то есть если тип специаль­ности — штукатур, кровельщик или электрик. Мы еще встретимся с опера­тором IN в подзапросах.

Предположим, что мы не можем точно вспомнить написание специаль­ности: «электрик» или «электронщик» или еще как-то. Символы шаблона, которые замещают неопределенные строки символов, облегчают поиск не­точного написания в запросе.

Символы шаблона.Символы, замещающие неопределенные строки символов.

Запрос: Перечислить работников, чей тип специальности начинается с «Элек».

WHERE SKILL_TYPE LIKE (‘Элек%’)

Результат:

WORKER ID NAME HRLY_RATE SKILL_TYPE SUPV_ID

1235 М.Фарадей 12.50 Электрик 1311

1311 Х.Колумб 15.50 Электрик 1311

В SQL есть два символа шаблона: % (процент) и _ (подчеркивание). Подчеркивание замещает ровно один неопределенный символ. Процент за­мещает произвольное число символов, начиная с нуля. Когда используются символы шаблона, для сравнения символьных переменных с константами требуется оператор LIKE (как). Другие примеры:

NAME LIKE ‘__Колумб’

Условие в первом примере истинно, если NAME состоит из двух симво­лов, за которыми следует ‘Колумб’. В таблице WORKER все имена начина­ются с первого инициала и точки. Таким образом, при помощи этого усло­вия мы. найдем всех работников по фамилии «Колумб». Условие второго примера позволяет найти всех работников, чьи фамилии начинаются на бу­кву «К».

Запрос:Найти все работы, которые начинаются в течение ближайших двух недель.

WHERE START _DATE BETWEEN CURRENT_DATE AND

CURRENT_DATE + INTERVAL ’14’ DAY

Результат: (Предположим, что текущая дата CURRENT DATE = 10.10)

WORKER_ID BLDG_ID START_DATE NUM_DAYS

1235 312 10.10 5

1235 515 17.10 22

3231 111 10.10 8

1412 435 15.10 15

3231 312 24.10 20

1311 460 23.10 24

Этот запрос иллюстрирует употребление оператора BETWEEN (между) со значениями типа date (дата) и interval (промежуток). CURRENT_DATE — это функция, всегда возвращающая значение сегодняшней даты. Выражение

CURRENT_DATE + INTERVAL ’14’ DAY

прибавляет двухнедельный промежуток к текущей дате. Таким образом, ASSIGNMENT выбирается (в предположении, что сегодня 10.10) в том слу­чае, если в ней значение столбца START_DATE лежит между 10.10 и 24.10. Из этого видно, что мы можем прибавлять к полям дат величины типа interval. Более того, мы можем умножать значения промежутков на целые величины. Например, предположим, что мы хотим выяснить, какое число будет через определенное количество недель (обозначенное переменной NUM_WEEKS (ЧИСЛО НЕДЕЛЬ)). Мы можем это сделать так:

CURRENT_DATE + INTERVAL ‘7’ DAY * NUM_WEEKS

2. Многотабличные запросы

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

Запрос: Каковы специальности рабочих, назначенных на здание 435?

Данные, необходимые для ответа, находятся в двух таблицах: WORKER и ASSIGNMENT. Для решения в SQL требуется перечислить обе таблицы в команде FROM и задать специальный тип условия WHERE:

FROM WORKER, ASSIGNMENT

Что здесь происходит? Мы должны рассмотреть два этапа обработки сис­темой данного запроса.

1. Как обычно, сначала обрабатывается фраза FROM. Однако в этом слу­чае, поскольку в команде указаны две таблицы, система создает декар­тово произведение строк этих таблиц. Это означает, что создается (логически) одна большая таблица, состоящая из столбцов обеих таб­лиц, в которой каждая строка одной таблицы спарена с каждой стро­кой другой таблицы. В нашем примере, поскольку в таблице WORKER пять столбцов, а в таблице ASSIGNMENT четыре столбца, в декартовом произведении, созданном командой FROM, будет девять столбцов. Общее число строк декартова произведения равно m * n, где m — число строк таблицы WORKER; а n — число строк таблицы ASSIGNMENT. По­скольку в таблице WORKER 7 строк, а в таблице ASSIGNMENT 19 строк, то декартово произведение будет содержать 7х19 или 133 строки. Если в команде FROM перечислено более двух таблиц, то создается декартово произве­дение всех таблиц, указанных в команде.

Декартово произведение. Результат объединения каждой строки одной таблицы с каждой строкой другой таблицы.

2. После создания гигантской реляционной таблицы система, как и пре­жде, применяет команду WHERE. Каждая строка таблицы, созданной командой FROM. проверяется на выполнение условия WHERE. Строки, не удовлетворяющие условию, исключаются из рассмотрения. Затем к оставшимся строкам применяется фраза SELECT.

Фраза WHERE в нашем запросе содержит два условия:

1. WORKER. WORKER_ >

Первое из этих условий — условие соединения. Обратите внимание, что поскольку обе таблицы WORKER и ASSIGNMENT содержат столбец с име­нем WORKER_ID, их декартово произведение будет содержать два столбца с таким именем. Для того чтобы различать их, мы помещаем перед именем столбца имя исходной таблицы, отделяя его точкой.

Первое условие означает, что в любой выбранной строке значение столбца WORKER_ >

Рис. 1. Соединение таблиц WORKER и ASSIGNMENT

Теперь мы покажем, как в SQL присоединить таблицу к ней самой.

Запрос: Перечислить работников, указав имена их менеджеров.

SELECT А.WORKER_NAME, B.WORKER_NAME

FROM WORKER A, WORKER В

Фраза FROM в этом примере создает две «копии» таблицы WORKER, давая им псевдонимы А и В. Псевдоним — это альтернативное имя, данное таблице. Затем копии А и В таблицы WORKER соединяются командой WHERE на основании условия равенства WORKER_ID в В и SUPV_ID в А. Таким образом, каждая строка из А присоединяется к строке В, содержащей информацию о менеджере строки А (рис.2).

Рис. 2. Соединение двух копий таблицы WORKER

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

К.Немо Г.Риковер Р.Гаррет Р.Гаррет

П.Мэйсон П.Мэйсон Г.Риковер Г.Риковер Х.Колумб Х.Колумб Дж.Барристер П.Мэйсон

Псевдоним. Альтернативное имя, данное таблице.

A.WORKER_NAME представляет работника, a B.WORKER_NAME пред­ставляет менеджера. Обратите внимание, что некоторые работники — сами себе менеджеры, что следует из выполненного в их строках равенства WORKER_ID — SUPV_ID.

В SQL можно за один раз связать более двух таблиц:

Запрос: Перечислить работников, назначенных на здания офисов.

FROM WORKER, ASSIGNMENT, BUILDING

NAME

Обратите внимание, что если имя столбца (например, WORKER_ID или BLDG_ID) встречается более, чем в одной таблице, то для избежания неопределенности мы должны перед именем столбца указать имя исходной таблицы. Но если имя столбца встречается только в одной таблице, как TYPE в нашем примере, то никакой неопределенности нет, поэтому имя таблицы указывать не нужно.

Команды SQL этого запроса создают одну таблицу из трех реляционных таблиц базы данных. Первые две таблицы соединяются по WORKER_ID, после чего к полученной таблице присоединяется третья таблица по BLDG_ID. Условие

команды WHERE приводит к исключению всех строк, кроме строк, относящихся к офисным зданиям. Это соответствует требованиям запроса.

Илон Маск рекомендует:  Что такое код cpdf_output_buffer

Подзапрос.Запрос внутри запроса

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

Запрос: Каковы специальности рабочих, назначенных на здание 435?

FROM WORKER WHERE WORKER_ID IN

Подзапрос в этом примере

Запрос, в котором содержится подзапрос, называется внешним запросом или главным запросом. Подзапрос приводит к созданию следующего множе­ства ИД (идентификаторов) работников:

Внешний запрос. Главный запрос, в котором содержатся все подзапросы.

Затем это множество ИД занимает место подзапроса во внешнем запросе. С этого момента выполняется внешний запрос, использующий множество, созданное подзапросом. Внешний запрос обрабатывает каждую строку таб­лицы WORKER в соответствии с условием WHERE. Если WORKER_ID строки лежит в (IN) множестве, созданном подзапросом, то SKILL_TYPE строки выбирается и выводится в результирующей таблице:

Очень важно, что фраза SELECT подзапроса содержит WORKER_ID и только WORKER_ID. В противном случае фраза WHERE внешнего запроса, означающая, что WORKER_ID лежит в множестве ИД работников, не имела бы смысла.

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

Некоррелированный подзапрос.Подзапрос, значение которого не зависит ни от какого внешнего запроса.

Приведем пример подзапроса внутри подзапроса.

Запрос: Перечислить работников, назначенных на здания офисов.

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

I can not see the table dba_object

I am trying to perform this query and did not return anything, tells me that the table does not exist

3 Answers 3

Both answers above are correct, however there is also a possibility that this could be a permissions issue. If you are logged in as a user who doesn’t have permission to this table it will give a table does not exist error.

you can check if your current user has access with the below (replacing username with the appropriate logged in user).

If you do not have permissions you will need to log in as SYS and grant permissions to this table or talk to your DBA to get this done.

And the * sign should be replaced by % :

Oracle is case sensitive. You should probably use an uppercase V in your LIKE clause and change * to % :

Also the correct catalog view name is dba_objects .

DBA_AUDIT_EXISTS

DBA_AUDIT_EXISTS displays audit trail entries produced by AUDIT EXISTS and AUDIT NOT EXISTS .

Column Datatype NULL Description
OS_USERNAME VARCHAR2(255) Operating system login username of the user whose actions were audited
USERNAME VARCHAR2(30) Name (not ID number) of the user whose actions were audited
USERHOST VARCHAR2(128) Client host machine name
TERMINAL VARCHAR2(255) Identifier of the user’s terminal
TIMESTAMP DATE Date and time of the creation of the audit trail entry (date and time of user login for entries created by AUDIT SESSION ) in the local database session time zone
OWNER VARCHAR2(30) Intended creator of the non-existent object
OBJ_NAME VARCHAR2(128) Name of the object affected by the action
ACTION_NAME VARCHAR2(28) Name of the action type corresponding to the numeric code in the ACTION column in DBA_AUDIT_TRAIL
NEW_OWNER VARCHAR2(30) Owner of the object named in the NEW_NAME column
NEW_NAME VARCHAR2(128) New name of an object after a RENAME or the name of the underlying object
OBJ_PRIVILEGE VARCHAR2(16) Object privileges granted or revoked by a GRANT or REVOKE statement
SYS_PRIVILEGE VARCHAR2(40) System privileges granted or revoked by a GRANT or REVOKE statement
GRANTEE VARCHAR2(30) Name of the grantee specified in a GRANT or REVOKE statement
SESSIONID NUMBER NOT NULL Numeric ID for each Oracle session
ENTRYID NUMBER NOT NULL Numeric ID for each audit trail entry in the session
STATEMENTID NUMBER NOT NULL Numeric ID for each statement run
RETURNCODE NUMBER NOT NULL Oracle error code generated by the action. Some useful values:

0 — Action succeeded

2004 — Security violation

CLIENT_ID VARCHAR2(64) Client identifier in each Oracle session
ECONTEXT_ID VARCHAR2(64) Application execution context identifier
SESSION_CPU NUMBER Amount of CPU time used by each Oracle session
EXTENDED_TIMESTAMP TIMESTAMP(6) WITH TIME ZONE Timestamp of the creation of the audit trail entry (timestamp of user login for entries created by AUDIT SESSION ) in UTC (Coordinated Universal Time) time zone
PROXY_SESSIONID NUMBER Proxy session serial number, if an enterprise user has logged in through the proxy mechanism
GLOBAL_UID VARCHAR2(32) Global user identifier for the user, if the user has logged in as an enterprise user
INSTANCE_NUMBER NUMBER Instance number as specified by the INSTANCE_NUMBER initialization parameter
OS_PROCESS VARCHAR2(16) Operating System process identifier of the Oracle process
TRANSACTIONID RAW(8) Transaction identifier of the transaction in which the object is accessed or modified
SCN NUMBER System change number (SCN) of the query
SQL_BIND NVARCHAR2(2000) Bind variable data of the query
SQL_TEXT NVARCHAR2(2000) SQL text of the query

The SQL_BIND and SQL_TEXT columns are only populated if the AUDIT_TRAIL initialization parameter is set to db_extended .

Oracle PL/SQL •MySQL •MariaDB •SQL Server •SQLite

Базы данных

SQL условие EXISTS

В этом учебном материале вы узнаете, как использовать SQL условие EXISTS с синтаксисом и примерами.

Описание

SQL условие EXISTS используется в сочетании с подзапросом и считается выполненным, если подзапрос возвращает хотя бы одну строку. Его можно использовать в операторе SELECT, INSERT, UPDATE или DELETE.

Синтаксис

Синтаксис условия EXISTS в SQL:

Параметры или аргументы

Примечание

Операторы SQL, использующие условие EXISTS, очень неэффективны, поскольку подзапрос повторно запускается для КАЖДОЙ строки в таблице внешнего запроса. Есть более эффективные способы написания большинства запросов, которые не используют условие EXISTS.

Пример — использование условия EXISTS с оператором SELECT

Давайте начнем с примера, который показывает, как использовать условие EXISTS с оператором SELECT.

В этом примере у нас есть таблица customers со следующими данными:

customer_id first_name last_name favorite_website
4000 Justin Bieber google.com
5000 Selena Gomez bing.com
6000 Mila Kunis yahoo.com
7000 Tom Cruise oracle.com
8000 Johnny Depp NULL
9000 Russell Crowe google.com

И таблица orders со следующими данными:

order_id customer_id order_date
1 7000 2020/06/18
2 5000 2020/06/18
3 8000 2020/06/19
4 4000 2020/06/20
5 NULL 2020/07/01

Теперь давайте найдем все записи из таблицы customers , где есть хотя бы одна запись в таблице orders с тем же customer_id . Выполните следующий SELECT запрос:

Будет выбрано 4 записи. Вот результаты, которые вы должны получить:

customer_id first_name last_name favorite_website
4000 Justin Bieber google.com
5000 Selena Gomez bing.com
7000 Tom Cruise oracle.com
8000 Johnny Depp NULL

В этом примере в таблице customers есть 4 записи, у которых значение customer_id имеется в таблице orders .

Пример — использование условия EXISTS с оператором UPDATE

Давайте рассмотрим пример, в котором используется условие EXISTS в операторе UPDATE.
В этом примере у нас есть таблица products со следующими данными:

product_id product_name category_id
1 Pear 50
2 Banana 50
3 Orange 50
4 Apple 50
5 Bread 75
6 Sliced Ham 25
7 Kleenex NULL

И таблица с именем summary_data со следующими данными:

product_id current_category
1 10
2 10
3 10
4 10
5 10

Теперь давайте обновим таблицу summary_data значениями из таблицы products . Введите следующий SQL оператор:

Будет обновлено 5 записей. Снова выберите данные из таблицы summary_data :

Вот результаты, которые вы получите:

product_id current_category
1 50
2 50
3 50
4 50
5 75
8 10

В этом примере будет обновлено поле current_category в таблице summary_data данными category_id из таблицы products , где значения product_id совпадают. Первые 5 записей в таблице summary_data были обновлены.

Подсказка: Если бы мы не включили условие EXISTS, запрос UPDATE обновил бы поле current_category на NULL в 6-й строке таблицы summary_data (поскольку таблица products не имеет записи, где product_id = 8).

Пример — использование условия EXISTS с оператором DELETE

Давайте посмотрим на пример, который использует условие EXISTS в опертаоре DELETE.

В этом примере у нас есть таблица customer со следующими данными:

Почему Oracle не говорит вам, что таблица или представление не существует?

Если вы использовали Oracle, вы, вероятно, получили полезное сообщение «ORA-00942: таблица или представление не существует». Существует ли законная техническая причина, по которой сообщение не включает имя недостающего объекта?

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

Я предполагаю, что когда эта ошибка была первоначально реализована, кто-то забыл добавить имя объекта, и теперь люди боятся, что он нарушит совместимость, чтобы исправить это. (Код, делающий глупые вещи, такие как разбор сообщения об ошибке, будет запутан, если он изменится.)

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

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

Вы можете установить СОБЫТИЕ в файле параметров (обычный текст или spfile), чтобы заставить Oracle сбрасывать подробный файл трассировки в user_dump_dest, может существовать имя объекта, если не SQL.

EVENT = «942 трассировка имени ошибки уровня 12»

Если вы используете обычный текстовый файл, вам нужно сохранить все настройки EVENT в последовательных строках. Не уверен, как это применимо к spfile.

SQL * Plus сообщает вам таблицу, которая не существует. Например:

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

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

С точки зрения вашего вопроса, я думаю, причина, по которой сообщение об ошибке не включает имя таблицы, заключается в том, что само сообщение об ошибке должно быть статическим текстом. Номер строки и местоположение в строке ошибки явно возвращаются к SQL * Plus (как-то).

Если вы используете инструмент просмотра SQL, такой как TOAD или TORA, это поможет вам с ошибками ORA, выделив или наведя курсор туда, где вы сделали свою ошибку.

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

У меня никогда не возникало проблем с интерпретацией сообщений об ошибках Oracle. Одна из причин заключается в том, что каждый интерактивный инструмент, который я видел для разработки SQL для Oracle, помогает указать местоположение, в котором возник вопрос. Это включает в себя SQL * Plus, как отмечали другие, и модуль Perl DBI:

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

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

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

Что касается того, почему Oracle решил делать это так, у меня есть некоторые предположения:

IBM использовала этот стиль сообщения об ошибке для System R, который Ларри Эллисон, Боб Майнер и Эд Оутс скопировали для сборки Oracle V2. (Обратная совместимость.)

Номер ошибки и местоположение — это наименьшее возможное представление диагностической информации. (Экономичность.)

Как я указал выше, упростить создание инструментов, которые подключаются к Oracle. (Совместимость).

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

Оператор EXISTS

Содержание

Синтаксис SQL 2003

Параметры и ключевые слова следующие

WHERE [NOT] EXISTS

Подзапрос проверяется на наличие одной или нескольких строк. Если хотя бы одна строка удовлетворяет запросу, то возвращается булево значение ИСТИНА. При указании дополнительного ключевого слова NOT булево значение ИСТИНА возвращается, если подзапрос не возвращает соответствующих ему строк.

подзапрос

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

Общие правила

Оператор EXISTS проверяет существование одной или нескольких строк в подзапросе родительского запроса.

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

Этот запрос возвращает фамилии авторов (au_lname), которые живут в том же городе, что и издатели (publishers). Обратите внимание, что можно использовать в подзапросе звездочку, поскольку подзапрос должен вернуть всего лишь одну запись с булевым значением ИСТИНА. В таких случаях столбцы не играют роли. Ключевой момент — это существование строки.

Советы и хитрости программирования

Во многих запросах оператор EXISTS выполняет ту же функцию, что и ANY. Оператор EXISTS обычно является наиболее эффективным при использовании с коррелированными запросами.

Оператор EXISTS семантически эквивалентен оператору ANY.

Подзапрос в операторе EXISTS обычно производит один из двух видов поиска. Первый вариант — это использование группового символа — звездочки (например, SELECT * FROM…), и в этом случае вы не извлекаете какой-то конкретный столбец или значение. Звездочка здесь означает «любой столбец». Второй вариант — выбор в подзапросе только одного конкретного столбца (например, SELECT aujd FROM). Некоторые отдельные платформы позволяют выполнять подзапросы по нескольким столбцам (например, SELECT aujd, aujname FROM…). Однако эта возможность достаточно редкая и ее следует избегать в коде, который нужно переносить на другие платформы.

Различия между платформами

Все платформы поддерживают оператор EXISTS в том виде, который мы описали выше.

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

Правила и методы использования оператора IS в базах данных на различных платформах

Правила и методы использования оператора IN в базах данных на различных платформах

Правила и методы использования оператора LIKE в базах данных на различных платформах

Особенности использования оператора BETWEEN в базах данных, основной синтаксис в выражениях

Linux.yaroslavl.ru

Учебник РНР
Назад Вперёд

(PHP 3>= 3.0.8, PHP 4)

dba_exists — проверяет, существует ли ключ.

Описание

bool dba_exists (string key, resource handle)

dba_exists() проверяет, существует ли специфицированный key в БД, специфицированной в handle .

Key это ключ, который проверяется.

Handle это дескриптор БД, возвращаемый функцией dba_open() .

dba_exists() возвращает TRUE или FALSE , если ключ найден или нет, соответственно.

DBA_AUDIT_EXISTS

DBA_AUDIT_EXISTS displays audit trail entries produced by AUDIT EXISTS and AUDIT NOT EXISTS .

Column Datatype NULL Description
OS_USERNAME VARCHAR2(255) Operating system login username of the user whose actions were audited
USERNAME VARCHAR2(30) Name (not ID number) of the user whose actions were audited
USERHOST VARCHAR2(128) Client host machine name
TERMINAL VARCHAR2(255) Identifier of the user’s terminal
TIMESTAMP DATE Date and time of the creation of the audit trail entry (date and time of user login for entries created by AUDIT SESSION ) in the local database session time zone
OWNER VARCHAR2(30) Intended creator of the non-existent object
OBJ_NAME VARCHAR2(128) Name of the object affected by the action
ACTION_NAME VARCHAR2(28) Name of the action type corresponding to the numeric code in the ACTION column in DBA_AUDIT_TRAIL
NEW_OWNER VARCHAR2(30) Owner of the object named in the NEW_NAME column
NEW_NAME VARCHAR2(128) New name of an object after a RENAME or the name of the underlying object
OBJ_PRIVILEGE VARCHAR2(16) Object privileges granted or revoked by a GRANT or REVOKE statement
SYS_PRIVILEGE VARCHAR2(40) System privileges granted or revoked by a GRANT or REVOKE statement
GRANTEE VARCHAR2(30) Name of the grantee specified in a GRANT or REVOKE statement
SESSIONID NUMBER NOT NULL Numeric ID for each Oracle session
ENTRYID NUMBER NOT NULL Numeric ID for each audit trail entry in the session
STATEMENTID NUMBER NOT NULL Numeric ID for each statement run
RETURNCODE NUMBER NOT NULL Oracle error code generated by the action. Some useful values:

0 — Action succeeded

2004 — Security violation

CLIENT_ID VARCHAR2(64) Client identifier in each Oracle session
ECONTEXT_ID VARCHAR2(64) Application execution context identifier
SESSION_CPU NUMBER Amount of CPU time used by each Oracle session
EXTENDED_TIMESTAMP TIMESTAMP(6) WITH TIME ZONE Timestamp of the creation of the audit trail entry (timestamp of user login for entries created by AUDIT SESSION ) in UTC (Coordinated Universal Time) time zone
PROXY_SESSIONID NUMBER Proxy session serial number, if an enterprise user has logged in through the proxy mechanism
GLOBAL_UID VARCHAR2(32) Global user identifier for the user, if the user has logged in as an enterprise user
INSTANCE_NUMBER NUMBER Instance number as specified by the INSTANCE_NUMBER initialization parameter
OS_PROCESS VARCHAR2(16) Operating System process identifier of the Oracle process
TRANSACTIONID RAW(8) Transaction identifier of the transaction in which the object is accessed or modified
SCN NUMBER System change number (SCN) of the query
SQL_BIND NVARCHAR2(2000) Bind variable data of the query
SQL_TEXT NVARCHAR2(2000) SQL text of the query

The SQL_BIND and SQL_TEXT columns are only populated if the AUDIT_TRAIL initialization parameter is set to db_extended .

Илон Маск рекомендует:  Элемент !DOCTYPE
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL