использовать имена столбцов из внутреннего запроса, выбрать столбцы для отображения во внешнем запросе

avatar
Arnold
8 апреля 2018 в 08:53
961
2
0

Мой сценарий выглядит следующим образом (в MySQL) У меня есть таблица, скажем, таблица 1, которая имеет 2 столбца:

userID, column_access

Таблица 2 со списком столбцов, например col1, col2, col3 и т. д.

Теперь я хотел бы использовать pymySQL для запроса таблицы 1 для столбцов, к которым разрешен доступ определенному идентификатору пользователя, путем проверки столбца, поля доступа (которое будет содержать разделенный запятыми список столбцов в таблице2) и используйте этот результат в другом запросе sql (который работает с таблицей 2), чтобы фактически получить данные из соответствующих столбцов, к которым пользователю разрешен доступ.

По сути, я хотел бы что-то вроде:

Выбрать (Выбрать column_access из таблицы1, где user_ID='123') из таблицы2

Таким образом, внутренний запрос должен возвращать список столбцов, скажем, col1, col2, которые будут использоваться для выбора столбцов во внешнем запросе в table2

Как это сделать в mySQL?

Источник

Ответы (2)

avatar
Gordon Linoff
8 апреля 2018 в 11:47
0

MySQL поддерживает предоставление пользователям привилегий на уровне столбца с помощью стандартного оператора grant.

Я бы посоветовал вам начать с документации по этому вопросу.

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

avatar
Xenon
8 апреля 2018 в 09:22
0

Я настоятельно рекомендую вам прочитать этот пост. Вы должны либо сначала сохранить столбцы в переменной, либо использовать динамический SQL-запрос. Использовать результат SELECT в качестве имени COLUMN в другом SELECT

Кстати, ваша схема даже не входит в 1 NF, так как у вас нет атомарных значений в таблице 1. Этого следует избегать.