Задача следующая:SQL: Как убедиться, что любой первичный ключ в любой таблице «принадлежит» известному идентификатору учетной записи (также PK) в верхней части иерархии?
Я отвечаю за создание интерфейса веб-сервисов для системы с огромной базой данных (сотни таблиц). Таблица верхнего уровня в базе данных - «Учетные записи» с первичным ключом Account_Id. Каждая строка в любой таблице может быть прослежена до одной учетной записи.
Каждая учетная запись должна иметь доступ к своей учетной записи через веб-службы.
Скажем, я создаю функцию веб-служб
DeleteProduct(string privateAccountKey, int productId);
Как я могу убедиться, что - в общем автоматическом режиме - это продукт, который они пытаются удалить (кто первичный ключ ProductID) на самом деле принадлежит рассматриваемая учетная запись?
Update:
Спасибо за ваши быстрые ответы, но мне нужно более общее решение:
Допустим, у нас есть 10 вложенных таблиц A, B, C, D, E, F, G, Н, I, J. A - таблица верхнего уровня, B имеет внешний ключ в A, C имеет внешний ключ в B, D имеет внешний ключ в C и т. Д.
Учитывая только первичный ключ A и первичный ключ J, мы хотим удалить строку в J. Но мы хотим удостовериться, что строка, которую мы удаляем, принадлежит к строке в A, идентифицированной поставляемым основным ключом A. Это значит, что нам нужно «присоединиться» или «присоединиться», отслеживать назад "через внешние ключи от J до A, выяснить, какой первичный ключ в A первичный ключ из J связан и сравнить его с поставляемым первичным ключом из A, с которым мы должны убедиться, что это связано.
Можно ли это сделать в общем случае с помощью системных таблиц или чего-то еще? Нет жестко скопированных объединений и проверок. Он должен работать с любым количеством вложенных таблиц, учитывая только первичный ключ таблицы верхнего уровня в тандеме с первичным ключом таблицы нижнего уровня (или любой другой таблицы между ними).
Старый:
Я concernced, что они потенциально могут отправить по идентификаторам продукции, которая принадлежит другим счетам, и эти продукты будут получать удалены. Те же проблемы существуют с любым другим удалением или изменением данных.
Что мне нужно это хранимая процедура, которая принимает в качестве входных
а) имя таблицы и имя первичного ключа этой таблицы
б) первичный ключ сам из строки в этой таблице
с) идентификатор верхнего уровня первичного ключа
и выполняет:
d) выяснить, какие счета первичный ключ б) Б elongs к
е) возвращает истину, если учетная запись из г) совпадает с ID (и счета) из с)
Е.Г.:
PKBelongsToAccount(string table, string primaryKeyName, int ID, int accountId)
Псевдо:
DeleteProduct(string privateAccountKey, int productId)
{
int accountId = FindAccountWhosPrivateKeyIs(privateAccountKey);
if (!PKBelongsToAccount("Products", "Product_Id", productId, accountId))
{
return;
}
else
{
// Product can safely be deleted
}
}
Решить PKBelongsToAccount (как функции/процедуры SQL). Он должен отслеживать отношения базы данных через FK до тех пор, пока не попадет в таблицу Account, не узнает, на какой учетной записи она действительно принадлежит, и сравните ее с идентификатором учетной записи того, к чему мы хотим.
Возможно, есть лучшие способы сделать это.
Извините за беспорядок.
В этом случае вам лучше разместить схему БД, чем ваш код. Можете ли вы дать представление о связанных таблицах и используемых ключах? – Eric
Я обновил сообщение, которое должно сделать его более ясным, что я ищу. Благодарю. – Kurt