Форум программистов, компьютерный форум, киберфорум
PostgreSQL
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
0 / 0 / 1
Регистрация: 05.10.2017
Сообщений: 53

Создание POLICY для таблицы

04.04.2020, 00:12. Показов 1660. Ответов 9

Студворк — интернет-сервис помощи студентам
Есть таблица Employee(сотрудники) с полями (id_employee, surname, name, patronymic, birthday, id_post, salary, id_tax, login).
Поле login - это название роли, id_tax - id налоговой.
Вот хочу чтобы мне выводились все сотрудники по налоговой
Oracle 11 SQL
1
2
3
4
5
6
CREATE  POLICY rls_pol_1 ON "Employee" FOR SELECT
TO employee USING
(id_tax = 
(SELECT DISTINCT
id_tax
WHERE id_tax = (SELECT id_tax WHERE "login" = CURRENT_USER)));
"Вроде всё хорошо", - подумаете вы. Но нет, выводит только одного сотрудника.
А если написать:
Oracle 11 SQL
1
2
3
4
5
6
CREATE  POLICY rls_pol_1 ON "Employee" FOR SELECT
TO employee USING
(id_tax = 
(SELECT DISTINCT
id_tax
WHERE id_tax = (SELECT id_tax FROM "Employee" WHERE "login" = CURRENT_USER)));
Должно быть всё хорошо, но это рекурсивная POLICY всё портит из-за FROM "Employee".
Может есть какое-то решение другого составления подзапроса?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.04.2020, 00:12
Ответы с готовыми решениями:

Создание таблицы для другой базы
Здравствуйте уважаемые форумчане! Решил (на свою голову) упростить создание БД для своего мини-проекта путём исполнения скрипта *.sql ...

Создание таблицы для users - компания
Нужна помощь. В моей базе данных есть таблица users куда добавляются ПОЛЬЗОВАТЕЛИ при регистрации, но я хочу сделать ещё отдельно...

PBR (Policy Based Routing) нет команды policy
Прошу помощи! Есть Cisco 3550, поднимаю PBR, после того ка прописал access-list, route-map, match ip address и set ip next-hop, пора...

9
1263 / 977 / 384
Регистрация: 02.09.2012
Сообщений: 3,020
04.04.2020, 12:28
что-то я не понимаю логики вашей полиси. что выхотите под USING сделать??
что id_tax принадлежит множеству уникальных id_tax в этой же таблице??
не вижу смысла в этом, не понимаю. опишите словами, что хотите сделать.

Цитата Сообщение от LuckyVadim Посмотреть сообщение
Вот хочу чтобы мне выводились все сотрудники по налоговой
это непонятно
0
0 / 0 / 1
Регистрация: 05.10.2017
Сообщений: 53
04.04.2020, 13:03  [ТС]
Сотрудник может зайти в БД под своим логином и паролем, но увидит он записи только, принадлежащие его налоговой. Сотрудников из другой налоговой он не должен видеть.
Вот админ может видеть все записи:
SQL
1
2
3
CREATE  POLICY rls_pol_0 ON "Employee" FOR ALL
TO "admin"
USING (TRUE);
Вот POLICY для другой таблицы "Платежи", в которой есть также есть поле id_tax(код налоговой):
SQL
1
2
3
4
5
6
7
8
CREATE  POLICY rls_pol_1 ON "Payment" FOR ALL
TO "employee" USING
(id_tax = 
(SELECT DISTINCT
"id_tax"
FROM
"public"."Employee"
WHERE "Employee".id_tax = (SELECT "Employee".id_tax FROM "Employee" WHERE "login" = CURRENT_USER)));
Здесь же всё работает хорошо, сотрудник из налоговой "1" видет платежи всех сотрудников налоговой "1"(логично)
0
1263 / 977 / 384
Регистрация: 02.09.2012
Сообщений: 3,020
04.04.2020, 19:42
зачем для этого distinct ??
так нет??
SQL
1
2
3
CREATE  POLICY rls_pol_1 ON "Payment" FOR ALL
TO "employee" USING
(id_tax = (SELECT "Employee".id_tax FROM "Employee" WHERE "login" = CURRENT_USER));
0
0 / 0 / 1
Регистрация: 05.10.2017
Сообщений: 53
04.04.2020, 20:01  [ТС]
Спасибо за то, что уменьшили запрос, но вопрос остался открыт. Для таблицы "Employee" я так и не могу создать адекватное условие, чтобы выводились все сотрудники налоговой(id_tax).
Так бесконечная рекурсия из-за from employee
SQL
1
2
3
4
5
6
CREATE POLICY rls_pol_1 ON "Employee" FOR SELECT
TO employee USING
(
id_tax 
= 
(SELECT "Employee".id_tax FROM "Employee" WHERE "login" = CURRENT_USER));
Так выводится только сотрудник с логином - CURRENT_USER
SQL
1
2
3
4
5
6
CREATE POLICY rls_pol_1 ON "Employee" FOR SELECT
TO employee USING
(
id_tax 
= 
(SELECT id_tax WHERE "login" = CURRENT_USER));
Но в текущей таблице три сотрудника из налоговой, а выводит одного
То есть пользователь с логином "1234" находится в налоговой(id_tax=1). И пользователи с логинами "10" и "20" в этой налоговой. Но выводит мне только текущего
0
1263 / 977 / 384
Регистрация: 02.09.2012
Сообщений: 3,020
04.04.2020, 20:24
Не, рекурсивно не получится.
using добавляется неявно к исходному запросу, чтобы исполнять политику.
у вас получается бесконечная рекурсия
0
0 / 0 / 1
Регистрация: 05.10.2017
Сообщений: 53
04.04.2020, 20:26  [ТС]
Да, это я имел ввиду. Вопрос в том, как это обойти?
0
1263 / 977 / 384
Регистрация: 02.09.2012
Сообщений: 3,020
04.04.2020, 20:46
Лучший ответ Сообщение было отмечено LuckyVadim как решение

Решение

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

Добавлено через 7 минут
SQL
1
2
3
4
5
6
7
8
9
10
11
12
CREATE TABLE tax_group
(
login text,
id_tax INTEGER
);
 
ALTER TABLE tax_group enable ROW level security;
 
CREATE policy rls_pol_grp_1 ON tax_group USING (login = CURRENT_USER);
 
CREATE policy rls_pol_1 ON employee FOR SELECT
USING (id_tax = (SELECT id_tax FROM tax_group WHERE login = CURRENT_USER);
1
0 / 0 / 1
Регистрация: 05.10.2017
Сообщений: 53
04.04.2020, 23:48  [ТС]
Спасибо, огромное. И последний вопрос. Можно ли реализовать вставку значений в эту таблицу("tax_group") тригерной функцией(как реализовать)?
То есть я записываю данные в таблицу "Employee", а after insert срабатывает тригер, запуская функцию, записывает новые значения в таблицу "tax_group"
0
1263 / 977 / 384
Регистрация: 02.09.2012
Сообщений: 3,020
05.04.2020, 17:56
да, так можно.
но и update и delete тоже нельзя забывать
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.04.2020, 17:56
Помогаю со студенческими работами здесь

Слишком длинный текст для изменения в поле для запроса на создание таблицы
Приветствую Уважаемых пользователей эхотага! Помогите пожалуйста разрешить следующею проблемную ситуацию. Есть запрос на создание...

Создание таблицы для судоку
Всем доброго времени суток.Пишу курсовую на тему "Судоку",надо в двумерный массив случайным образом заносить числа от 1 до 9.Вот часть...

Создание таблицы для расписания
Добрый день уважаемые форумчане. Необходимо создать таблицу для составления расписания предметов. Все вроде бы просто. По оси x...

Создание функции для таблицы
Помогите создать универсальную функцию на javascript. Суть самой функции в том, что она имеет следующие параметры show(x_data, number,...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru