Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Oracle Tutorial.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
401.64 Кб
Скачать

Раздача прав (grants).

Для разграничений прав доступа к объектам текущей схемы для других пользователей используется раздача прав доступа с помощью команды grant. Забрать права можно командой revoke.

Допустим, мы залогинены в схеме SCHEME1, в которой есть таблица TAB1 и пакет(или процедура, функция) PKG1. Имеется схема SCHEME2, которой мы раздаем права:

Grant select on SCHEME1.TAB1 to SCHEME2; /*Дать права на SELECT из таблицы TAB1*/

Grant insert, update, delete on SCHEME1.TAB1 to SCHEME2; /*Дать права на insert, update, delete таблицы TAB1*/

Revoke insert, update, delete on SCHEME1.TAB1 from SCHEME2; /*Забрать права на insert, update, delete таблицы TAB1*/

Grant alter on SCHEME1.TAB1 to SCHEME2; /*Дать права на alter таблицы TAB1*/

Grant all on SCHEME1.TAB1 to SCHEME2; /*Дать все права на таблицу TAB1*/

Grant execute on SCHEME1.PKG1 to SCHEME2; /*Дать права на выполнение PKG1*/

Grant create database link to SCHEME2; /*Дать права создавать database link*/

Операции над множествами, joins.

Продемонстрируем операции над множествами:

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

CREATE TABLE KK_T1 AS

SELECT 1 VAL FROM DUAL

UNION ALL

SELECT 2 VAL FROM DUAL;

CREATE TABLE KK_T2 AS

SELECT 2 VAL FROM DUAL

UNION ALL

SELECT 3 VAL FROM DUAL;

Объединение с убиранием дубликатов:

SELECT VAL FROM KK_T1

UNION

SELECT VAL FROM KK_T2;

Объединение без убирания дубликатов:

SELECT VAL FROM KK_T1

UNION ALL

SELECT VAL FROM KK_T2;

Разность множеств, KK_T1 \ KK_T2:

SELECT VAL FROM KK_T1

MINUS

SELECT VAL FROM KK_T2;

Пересечение множеств, KK_T1 ∩ KK_T2:

SELECT VAL FROM KK_T1

INTERSECT

SELECT VAL FROM KK_T2;

Задача. Сравнение множеств.

Даны таблицы KK_STUDENTS_2010 и KK_STUDENTS_2012 со списками студентов за 2010 год и 2012 год.

С 2010 года по 2012 год некоторых студентов выпустили, приняли некоторых новых студентов, некоторые продолжают обучение.

Требуется создать отчет вида

NAME

WAS_STUDENT_IN_2010

WAS_STUDENT_IN_2012

ИВАНОВ

N

Y

ТРУНОВ

Y

Y

ДРОНОВ

Y

Y

ШТАНОВ

Y

N

двумя способами

- UNION, MINUS, INTERSECT;

- FULL OUTER JOIN.

Создадим таблицы, заполним их данными:

CREATE TABLE KK_STUD_2010(ID INTEGER, NAME VARCHAR2(30));

CREATE TABLE KK_STUD_2012(ID INTEGER, NAME VARCHAR2(30));

INSERT INTO KK_STUD_2010(ID, NAME) VALUES(2,'ТРУНОВ');

INSERT INTO KK_STUD_2010(ID, NAME) VALUES(3,'ДРОНОВ');

INSERT INTO KK_STUD_2010(ID, NAME) VALUES(4,'ШТАНОВ');

INSERT INTO KK_STUD_2012(ID, NAME) VALUES(1,'ИВАНОВ');

INSERT INTO KK_STUD_2012(ID, NAME) VALUES(2,'ТРУНОВ');

INSERT INTO KK_STUD_2012(ID, NAME) VALUES(3,'ДРОНОВ');

Первое решение:

(

SELECT ID, NAME, 'Y' AS WAS_IN_2010, 'N' AS WAS_STUDENT_IN_2012 FROM KK_STUD_2010

MINUS

SELECT ID, NAME, 'Y' AS WAS_IN_2010, 'N' AS WAS_STUDENT_IN_2012 FROM KK_STUD_2012

)

UNION

(

SELECT ID, NAME, 'Y' AS WAS_IN_2010, 'Y' AS WAS_STUDENT_IN_2012 FROM KK_STUD_2010

INTERSECT

SELECT ID, NAME, 'Y' AS WAS_IN_2010, 'Y' AS WAS_STUDENT_IN_2012 FROM KK_STUD_2012

)

UNION

(

SELECT ID, NAME, 'N' AS WAS_IN_2010, 'Y' AS WAS_STUDENT_IN_2012 FROM KK_STUD_2012

MINUS

SELECT ID, NAME, 'N' AS WAS_IN_2010, 'Y' AS WAS_STUDENT_IN_2012 FROM KK_STUD_2010

);

Второе решение:

SELECT NVL(KK_STUD_2010.ID, KK_STUD_2012.ID) ID,

NVL(KK_STUD_2010.NAME, KK_STUD_2012.NAME) NAME,

DECODE(KK_STUD_2010.ID, NULL, 'N', 'Y') AS WAS_STUDENT_IN_2010,

DECODE(KK_STUD_2012.ID, NULL, 'N', 'Y') AS WAS_STUDENT_IN_2012

FROM KK_STUD_2010

FULL OUTER JOIN KK_STUD_2012

ON KK_STUD_2010.ID = KK_STUD_2012.ID;

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

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]