sqlite 如何防止用户修改查询中的外键?

jjjwad0x  于 2022-11-24  发布在  SQLite
关注(0)|答案(1)|浏览(146)

我的表具有外键关系:

Users:
id,
has_many posts

Posts:
id,
has_many paragraphs

Paragraph:
id,
String text

我的查询是按帖子的id查看帖子,按段落的id查看段落。我的模式比这复杂得多,但仍然有一个具有特定id的用户对资源的明确所有权。给定一个用户的id,在SQL中是否有任何方法来验证只能对该用户拥有的资源执行查询?
第一次
架构可能会变得很复杂,编写起来很麻烦。有没有内置的SQL解决方案?我用的是SQLite,但是通用的解决方案也可以。

wf82jlnq

wf82jlnq1#

在回答之前,我们需要明确一件事:这里的sqllite(或任何其他潜在的数据库引擎)并不知道表中的数据是用户、所有权等等。从DB引擎的Angular 来看,这些是字节,而且只有字节。
如果您试图在数据库引擎端解决该问题,唯一的方法是对每个查询的所有权表执行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)以进行筛选。
然而,对于大型的现代应用程序或服务,通常在应用程序代码上解决它,而不是在数据库端。

相关问题