Я новичок MySQL и ищу решение следующей задачи:Mysql выводит внешний ключ для случайных запросов
Я хотел бы создать CMS с CppCMS, которые должны быть способны иметь модули. Поскольку я хочу уменьшить вероятность (случайного) доступа к конфиденциальным данным, мне нужен модуль, который обрабатывает доступ к данным и права. Поскольку этот модуль должен быть не осведомлен о структурах данных, созданных другими модулями, я бы хотел, чтобы он вывел владельца данных через внешний ключ отношений. Моя идея заключалась бы в поиске пути (по внешним ключам), который связывает строку с идентификатором пользователя.
Сложите: Что я пытаюсь сделать
- Принимая случайный запрос, определить измененные строки
- для изменяемых строк определяют отношения/путь (через внешние ключи) к user/userid (столбец в существующей таблице)
- возвращает только строки, для которых может быть определено отношение, и выполняется условие (например, идентификатор пользователя, найденный в соответствующем запросе, совпадает с фиксированным идентификатором пользователя, таким как пользователь, система)
(Насколько я знаю, внешние ключи только обеспечивать существование ключа в другой таблице, однако предпосылкой я принимаю, что каждая строка связана с пользователем по пути иностранных ключевых отношений)
Моя проблема/вопрос:
есть ли существующее решение/Better подход к проблеме? Подготовленные утверждения не будут делать трюк, так как я не знаю всех данных/запросов заранее.
Как получить отношения с внешним ключом? Есть ли другой способ, кроме «SHOW CREATE TABLE», а затем синтаксический анализ строки результата?
Как определить строки, которые будут затронуты, без их модификации? Я хотел бы отфильтровать этот набор после определения, могу ли я связать его с текущим пользователем (а не с пользователем mysql, но с системным пользователем).
Могу ли я попытаться выполнить запрос, а затем выбрать строки влияния, и если я определяю нарушение доступа, просто выполните откат? Проблема с этим: как сделать изменения в подмножестве строк, для которых оно является законным (например, я пытаюсь изменить 5 строк, может только изменить 2, как только изменить те 2). Одна из идей заключалась в поиске способа создания временной таблицы с набором результатов; это решение имеет несколько недостатков: отношения внешних ключей не могут быть временными таблицами, они «потеряны».
P.S .: Я кодирую в C++, поэтому я предпочел бы рекомендации, совместимые с cpp-совместимостью, однако я открыт для других предложений. В то время как googling я наткнулся на доктрину, и я сейчас изучал ее. P.P.S .: База данных InnoDB двигатель (должен из-за внешних ключей)
UPDATE: Объяснение Попытка Часть 2: Я пытаюсь отфильтровать collumns пользователю разрешено видеть из таблиц. Для этого я хотел бы найти соединение в базе данных по внешним ключам (по внешним ключам я гарантирую, что могу получить все данные по соединениям, и они представляют собой намек на то, какие столбцы я должен присоединиться).Поскольку я планирую сложную систему (например, форум), я не хочу объединять все данные во временной таблице и запускать запрос пользователя на них. Я бы предпочел оценить userquery и проверить результат, если я могу сопоставить его с соединением с идентификатором пользователя. Например, я мог бы использовать это, чтобы обеспечить, чтобы кнопка редактирования была включена только для сообщений, созданных пользователем. (Я знаю, что есть более простые способы сделать это, но я в основном хочу, чтобы программисты могли писать свои собственные запросы, не предоставляя им возможность редактировать или просматривать данные, которые им не позволяют видеть. Мое предположение заключается в том, что программист не является evildoer, но просто забывая о ограничениях, поэтому я хочу обеспечить их исполнение в программном обеспечении).
Получение здесь будет довольно хорошим, но у меня есть еще более сложная потребность.
Первый базовый пример. Скажем так, как и facebook, и всем друзьям человека разрешено видеть его фотографии.
pictures = id **userid** file (bool)visibleForFriends album
friendship = **userid1** **userid2**
users = userid
То, что я хочу, чтобы случиться:
- входной программатор "SELECT * FROM фотографии, где альбом = 2"
- система получает все соответствующие записи (например, набор идентификаторов)
- системы видит внешний ключ пользователя, пытается сопоставить текущий идентификатор пользователя с изображениями userid, добавляет все совпадения с возвращаемой частью результата
- Системные уведомления special visibleForFriends колонка
- Система пытается всего определится все друзья (SELECT userid1 FROM дружбой WHERE userid2 = currentUserID присоединиться (надо читать на соединения) ВЫБОР userid2 от дружбы WHERE userid1 = currentUserID)
- Система добавляет все строки, где visibleForFriends is true и pictures.userid = Результат от 5.
В то время как часть Дружбы - это дополнительный код (я думаю, что можно сделать, если igot начался с первого бита), мне все же нужно выяснить, как автоматически следовать за иностранным для просмотра соединения. Не обращая внимания на особый случай дружбы (особый случай), я хотел бы, чтобы система работала на этом, а также:
pictures = id **albumid** file (bool)visibleForFriends album
albums = id **userid**
users = userid
Теперь система должна идти фотографии. albumid ==> albums.id -> альбомы. userid ==> users.userid.
Надеюсь, что примеры немного выяснили вопрос. Одна из проблем заключается в том, что в первой части примера (ввод запроса программиста) я не хочу, чтобы «DELETE *» вступал в силу с тем, что не принадлежит пользователю. Поэтому я должен отфильтровать, какие строки фактически удалить.
Большое спасибо, я попробую это, как только я вернусь домой в свою базу данных. Я попытался привести пример в своем вопросе (из жирного обновления вниз) – ted