Oracle Developer👨🏻‍💻
3.22K subscribers
610 photos
68 videos
2 files
488 links
🔝 канал о разработке в СУБД Oracle:
SQL, PL/SQL, оптимизация, архитектура и многое другое...

Backend-pro.ru - обучение по различным программам, связанных с backend-разработкой для ФЛ и ЮЛ.

Отец-основатель: @denis_dbd Кивилёв Денис
Download Telegram
Коллеги, всем привет!

Это последнее сообщение 2021-го. Немного итогов. С точки зрения канала, это был продуктивный год:
🔹написано ~200 постов;
🔹было запущено две обучающих программы;
🔹+800 коллег, интересующихся темой Oracle;
🔹опробованы разные форматы и многое другое.
Что-то получилось, что-то не очень. Это нормально. Я точно так же учусь вместе с вами.

Незаметно для меня количество подписчиков выросло до 2022 (символично).
Последние ~300 человек добавились без какого-либо платного продвижения. Видимо, сарафанное радио и органический трафик делают своё дело.
Я рад, что кому-то это надо. Спасибо вам за поддержку. Вы крутые 😉👍

Планов на будущий год громадьё, посмотрим, что получится сделать.

От себя хочу пожелать - здоровья, счастья и успехов во всех делах. Берегите себя и своих близких 🎄

С наступающим 2️⃣0️⃣2️⃣2️⃣ годом!

Создатель канала Oracle Developer, Кивилёв Денис
👍5
Друзья, всем привет!
Первый пост в 2022.

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

Кстати, сегодня стартанул новый поток “ Oracle PL/SQL.Основы”. Ребята пустились в трехмесячное плавание 🚤

Приятно, что с момента поста в прошлом году к нам присоединилось еще 35 человек. Добро пожаловать! 🤝

Завтра начнем 😉
👍25🔥3
Задача

Существует схема HR. В ней есть таблица TAB1.
Грант на чтение из этой таблицы дан пользователю JAVA_APP_USER.
grant select on hr.tab1 to java_app_user;

Затем выполняется команда по блокировке пользователя HR:
alter user hr account lock;

Что произойдет при обращении к таблице HR.TAB1 под пользователем JAVA_APP_USER?
select * from hr.tab1;

Обсуждение, как всегда, в четверг 🎓

Варианты для выбора ниже ⬇️

#задача
👍2
Схемы и пользователи

Схема - контейнер для хранения объектов.
Пользователь - владелец схемы.
Создавая/удаляя пользователя, вы создаете/удаляете схему.

Создание пользователя
create user имя
identified by пароль
default tablespace users
temporary tablespace temp
profile default
quota unlimited on users;

Удаление пользователя со всеми объектами
drop user имя cascade;

Изменение пароля
alter user имя identified by пароль;

Блокировка/Разблокировка
alter user имя account lock;
alter user имя account unlock;

Просрочка пароля
alter user имя password expire;

Вывод пароля из просрочки
изменить пароль

Системные представления с пользователями
dba_users, all_users, user_users

Это далеко не весь перечень команд и не все возможные варианты опций.
Документация наше всё - create, alter
Сохраняйте в закладки 😉

Oracle Developer
#шпаргалка #user #schema
👍19🤩1
Задача: чем завершится обращение к объекту заблокированного пользователя?
полная постановка в посте вторника.

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

Существует основная схема с данными, PL/SQL-логикой и т.п. и интеграционные схемы, которым выдаются определенные гранты на использование объектов основной схемы.
Через интеграционные схемы/пользователей подключаются приложения/люди.
При этом в PROD среде пользователя основной схемы блокируют.
Таким образом, подключиться непосредственно под ним не получится.
Но, при всем при этом, использовать его объекты, при наличии грантов, можно. Блокировка никак не повлияет на доступность объектов схемы.

Профит: безопасность + условная single responsibility + проще поддерживать + ...

Правильный ответ: “запрос будет успешно выполнен”.

Хочется высказаться? Велком в чатик канала.

#решениезадачи #архитектура
👍5🔥2
Установка Oracle 21c Express Edition в Docker 🎥

Друзья всем привет!
Года два назад, я стартанул свой youtube-канал с двух видео об установке СУБД Oracle 18xe, 19ee в Docker.

И вот, 02.12.2021 корпорация "Oracle" добавила набор скриптов для создания Docker-образов(image) для Oracle 21c Express Edition.
Я решил запилить видео-инструкцию о том, как установить Oracle 21XE в Docker. Вероятно, вам может пригодится.

Зачем 21с?
Есть некоторые вкусные фишки, которые появились именно в этой версии. О них я расскажу в течении года.

Почему Express Edition?
С 18й версии СУБД достаточно Express Edition, чтобы пощупать фишки Enterprise Edition. На мой взгляд, для учебных и тестовых целей этой версии хватит на 100%.

Почему Docker?
Фактически Docker это уже стандарт, который необходимо знать, если вы хотите быть в тренде. С его помощью можно легко на вашей ОС развернуть сколько угодно и каких угодно систем. Kafka-кластер, разные версии СУБД Oracle, PostgreSQL и прочее. Основная ОС остается чистой. При этом не важно, стоит у вас MacOS или Windows.

Ставьте, пользуйтесь! 👍🏻

А впереди еще много интересных видео и материалов 🎓

Oracle Developer
#видео #docker #oraclexe
🔥12👍91
Задача: написать анонимный PL/SQL-блок, который выведет числа от 1 до 9 используя for...loop.

Требуемый вывод:
1
3
5
7
9

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

Обсуждение задачи, как всегда, в четверг 🎓

Велком в чатик, если хочется поделиться своим вариантом решения 😉

#задача
👍1
Задача: написать анонимный PL/SQL-блок, который выведет числа от 1 до 9 используя for loop. В выводе не должно быть четных чисел.

Решение
Не забываем, почти у любой задачи есть несколько вариантов решения. Приведу парочку.

1️⃣ Проверка счетчика итерации на четное значение, используя остаток от деления (mod). Если значение четное - пропускаем эту итерацию (continue). Остаток от деления, довольно часто, используется в задачах типа, “коммитить каждые N записей”.

begin
for i in 1 .. 10 loop
if mod(i, 2) = 0 then
continue;
end if;
dbms_output.put_line(i);
end loop;
end;
/

2️⃣ Использование расширенного Loop в Oracle 21c.
Юзаем указание шага через by.

begin
for i in 1..10 by 2 loop
dbms_output.put_line(i);
end loop;
end;
/

Для экспериментов вполне пригодится СУБД Oracle21с XE, установленная в Docker.

3️⃣ И другие варианты, на которые хватит вашей фантазии 🧠
Кое-какие накидали ребята в чатике. Гранд мерси 😉

#решениезадачи #loop
👍71
Задача: необходимо задать правило на сложность пароля определенным пользователям в БД.

Правила:
1. Не должен быть равным имени пользователя.
2. Должен содержать символ “#”.

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

Примеры:
alter user ivanov identified by ivanov; – ошибка
alter user ivanov identified by ivanov1; – ошибка
alter user ivanov identified by ivanov#1;-- ок

Разбор решения, как всегда, в четверг 🎓

#задача
Задача: задать кастомное правило валидации пароля. Подробней см. пост вторника.

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

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

продолжение ниже ⬇️
create or replace function sys.student_pwd_verify_function(username     varchar2
,password varchar2
,old_password varchar2)
return boolean is
begin
return password like '%#%' and lower(password) != lower(username);
end;
/
grant execute on sys.student_pwd_verify_function to public;

create profile student_profile
limit password_verify_function
student_pwd_verify_function container = current;

create user ivanov
identified by ivanov#
default tablespace users
temporary tablespace temp
profile student_profile;

Попытка сменить пароль на не подходящий под валидацию будет заканчиваться ошибкой:
ORA-28003: password verification for the specified password failed

"container = current" - для контейнерных БД.
⚠️ Все манипуляции выполняются под привилегированным пользователем.

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

Перетереть в чатике

#решениезадачи #profile
Яндекс + Oracle

Сидишь никого не трогаешь, резюме везде закрыто, работу не ищешь, и все равно, нет нет, да упадет предложение от “охотников за головами”.
В декабре опять произошла подобная история. На этот раз HR-фрилансер с позицией Oracle DBD в Яндекс. Ух, сам Яндекс(!)

Был удивлен. Зачем Яндексу Oracle-разработчики? Но, тем не менее, есть позиции, где требуется данная квалификация 🎓
Нет смысла нудить про импортозамещение, про “Oracle дорого”, про скрепы, YandexDB и т.п. Надо значит надо.

Один мой бывший коллега, на различных online-митапах, часто говорит о том, что он “прошел собеседование в Яндекс, но выбрал другую компанию”. Т.е. пройти собеседу туда считается достижением (без сарказма).

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

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

Ребятам с Яндекса (они теперь в канале). Вы крутые, спасибо за уделенное время. Я обещаю не публиковать конкретные формулировки ваших заданий.

Всем хороших выходных!

#яндекс
👍25🔥3
Oracle & Яндекс. Часть 2
Судя по всему, тема с Яндексом интересна. Продолжаю.
Оговорюсь, это мой личный опыт. У вас он может быть другим.

На декабрь месяц, было два направления для Oracle DBD:
1️⃣ Разработчик Oracle + OeBS
2️⃣ Разработчик Oracle в Яндекс.Банк
Не уверен, что специалисты до сих пор нужны, но вакансии активны.

Этапы собеседования:
1️⃣ общение с тим-лидом команды;
2️⃣ техническое собеседование;
3️⃣ общение с CEO направления;
4️⃣ финалочка с презентацией оффера.

Алгоритмического этапа для DBD решили не делать. К вопросу, как часто спрашивают про ООП и SOLID на собеседованиях на DBD - “никогда”.

Смею предположить, что вам интересен этап “техническое собеседование”.
Мне посчастливилось пройти техническое собеседование и на первую вакансию, и на вторую. Поэтому есть некоторое представление.
🔹На техническое собеседование дают 1 час.
🔹3-4 задачи.
🔹Все это происходит по Zoom в реальном времени. Вы рассуждаете, пишите запросы/отвечаете, интервьюер внимательно слушает ход ваших мыслей.
🔹Если у вас есть уточняющий вопрос по заданию - могут подсказать.
🔹Царит вполне дружелюбная обстановка, никто вас не пытается “загнобить”.
Ребятам с Яндекса - респект. Было приятно пообщаться 👍

Основные группы вопросов: SQL-функции, задачи на соединения, аналитические функции. На аналитику особенный упор. Еще был один общий вопрос на оптимизацию. Примерно такой.
Некоторые из задач мы уже разбирали в канале. Некоторые я еще опубликую, в измененном виде.

Пока всё. Продолжение в следующих постах 😉

#яндекс
👍20🔥3
Непересекающиеся отрезки

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

Необходимо написать запрос проверяющий пересечения.

create table client_tariff(
client_id number(38) not null,
date_from date not null,
date_till date not null
--...
);

insert into client_tariff values
(1, date'2022-01-01', date'2022-01-10');
insert into client_tariff values
(1, date'2022-02-01', date'2022-02-13');

Примеры:
c '2022-01-10' по '2022-01-12'-- ок
с '2022-01-10' по '2022-02-01'-- ok
c '2021-12-01' по '2022-01-02' - ошибка
с '2022-01-14' по '2022-02-03'-- ошибка

Визуально можно посмотреть на рисунке:
▫️1-й отрезок пересекается своим окончанием с уже имеющимся;
▫️2-й отрезок пересекается своим началом с окончанием имеющегося;
и так далее. варианты могут быть различные.
▫️“все ок” - отрезки, которые не пересекаются с имеющимися.

Решение в четверг 🎓

#задача #яндекс
👍7
Непересекающиеся отрезки. Решение

Задача: постановка в посте вторника.

Решение:
Суть: необходимо проверять границы отрезков. Можно решить задачу ”в лоб”. Расписать все кейсы, когда новый отрезок заходит одной границей на начало отрезка в таблице, когда другой и т.д. Получится огромная “портянка” из условий.

Можно пойти от обратного (см. рисунок)
Достаточно проверить, что b2 > a and a2 < b;

Итоговый запрос:
select count(1)
from (select 1 client_id,
date'2022-01-10' d_from,
date'2022-01-12' d_till
from dual) e
join client_tariff t
on t.client_id = e.client_id
and e.d_till > t.date_from
and e.d_from < t.date_till;

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

Обсудить в чатике
#решениезадачи #яндекс #отрезки
👍12
Всем хорошей пятницы и выходных 🎊

#юмор
🔥28👍12
Задача: дана таблица tab1. В ней N-строк. Необходимо написать запрос, который для каждых 3 строк будет считать сумму поля “n”. Сортировка по “n”.

Для текущего примера (см скриншот). В таблице хранится 7 строк: 1, 2, 3, 4, 5, 6, 7.

Результатом запроса будет три строки с суммами (см скрин):
1) 1 + 2 + 3 = 6
2) 4 + 5 + 6 = 15
3) 7 = 7

Для повторения:
create table tab1(
n number(10)
);
insert into tab1
select level
from dual connect by level <= 7;
commit;

Обсуждение решения в четверг 🎓

#задача #яндекс
👍12🔥1