Вот сценарий:
У меня есть простая таблица «Инвентаризация».Эта таблица имеет три столбца: один внешний ключ, который ссылается на продукт, один внешний ключ, который ссылается на магазин, и одно числовое значение для цены.В этой таблице не указывается количество доступного продукта, она просто используется для информирования пользователей о том, что магазин продает конкретный продукт.
Эта таблица инвентаризации доступна для публичного просмотра (в этом весь смысл приложения:пользователи должны иметь возможность искать различные товары в различных (потенциально не связанных) магазинах).Магазины должны иметь возможность обновлять свои собственные товарные запасы, не влияя на товарные запасы других магазинов.
Теперь у каждого магазина есть собственная учетная запись и представление.Представления по сути настраиваются следующим образом:
CREATE VIEW MY_INVENTORY AS SELECT I.ProductID, I.StoreID, I.Price FROM Inventory I WHERE I.StoreID = id
Каждый магазин имеет полное разрешение на свой собственный вид инвентаря, так что каждый магазин может добавлять предметы в свой инвентарь, обновлять их и т. Д.
Вот загвоздка: каждый магазин может добавлять элементы в это представление с идентификатором StoreID, который не соответствует их собственному StoreID!Таким образом, они могут добавлять товары в запасы других магазинов (что, безусловно, нет-нет).
Я уже создал интерфейсное приложение для доступа к базе данных, и это достаточно просто программноубедитесь, что ни один магазин не влияет на инвентарь другого магазина, но я хочу более надежную защиту, чем эта.Как мне применить это на уровне базы данных?Триггеры?Ограничения?Я изучил оба варианта и не совсем уверен, как это сделать.
И последнее: только учетная запись корня БД и отдельные хранилища имеют доступ к представлениям отдельных хранилищ.