我有具有外鍵關系的表:
Users:
id,
has_many posts
Posts:
id,
has_many paragraphs
Paragraph:
id,
String text
我有查詢要按帖子的 ID 查看帖子并按段落的 ID 查看段落。我的模式比這更復雜,但具有特定 ID 的用戶仍然清楚地擁有資源所有權。給定用戶 ID,SQL 中是否有任何方法可以驗證查詢只能針對該用戶擁有的資源進行?
validateUserForPostId(postID, userID):
IF CreateSQLQuery("SELECT parent.ID FROM posts child JOIN on users on parent.ID = child.userID WHERE child.ID = ?", postID) == userID:
return true; // Valid, so we should be able to read or write post with ID = postID
validateUserForParagraphId(paragraphID):
// Similar join logic
模式可能會變得復雜并且寫起來很煩人。是否有內置的 SQL 解決方案?我正在使用 SQLite,但通用解決方案也適用。
uj5u.com熱心網友回復:
在回答之前,我們需要弄清楚一件事:sqllite這里(或任何其他潛在的資料庫引擎)并不知道表中的資料是用戶、所有權等。從您的資料庫引擎的角度來看,這些是位元組,而且只是位元組。
如果您試圖在資料庫引擎端解決該問題,唯一的方法是JOIN針對每個查詢的所有權表并過濾掉資料。例如,如果您正在嘗試閱讀一篇文章,而不是:
select
content, timestamp, userID
from
posts
您需要將具有當前用戶 ID 的引數傳遞到查詢中以最小化檢查:
select
posts.content,
posts.timestamp,
posts.userID
from
posts child
join users on parent.ID = child.userID
where
parent.ID = '?'
and child.ID = '?'
一種使其更易于管理的流行解決方案是使用存盤程序之類的東西(很多資料庫引擎都支持它們)。它變成了這樣的:
EXEC sp_getPost “postID”, “userID”
另一種方法是在資料庫引擎端創建視圖,執行必要的連接并始終公開一致的列名(如authorUserId)以進行過濾。
但是,對于大型現代應用程式或服務,通常在應用程式代碼中解決它,而不是在資料庫端。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/536490.html
標籤:数据库sqlite验证
上一篇:如何在護照中找到嵌套物件?
