0

在我们的应用程序中,我们需要防止用户向数据库中插入不符合条件的记录。条件是 select 语句的 where 子句,由某个管理员用户定义。这是一个示例,有一个名为“Book”的表,管理员用户将条件定义为“pages<=200 OR type='Children's book'”。定义该标准后,不允许将页面超过 200 页且类型不是“儿童书”的书籍插入数据库。

Table: Book (id, name, author, pages, type)

Criteria: "pages<=200 OR type='Children's book'"

条件可能更复杂,但将遵循 oracle sql 语法。我能想到的一个选择是先插入记录,然后检查它是否可以通过标准选择出来,如果不能,那么我们从数据库中删除 if,但我认为应该有一种更简洁的方法来完成这项工作。如果能用一条sql语句就可以完成就好了。

有没有人有更好的方法来完成这项工作?任何答案将不胜感激。

更新:

感谢您的回答,我想我应该提供更多详细信息。

有问题的用户是应用程序用户,包括“管理员用户”,它不是 dba。标准可以经常更改,并且对于不同的用户组,我们可能在同一张表上有不同的标准。因此,希望可以在应用程序端进行检查。我们正在使用具有自己 ORM 的 django,但我认为我应该首先找到一种使用 sql 语句的方法,这将在某些时候连接标准。理想情况下,我们可以将“where 子句”约束附加到插入语句,以便在值满足这些约束时将记录插入数据库,否则什么也不做。

4

3 回答 3

1

如果标准与您的示例中的一样,则应设置一些检查约束

Alter table book add CONSTRAINT check_type CHECK (type = 'Children''s book');
Alter table book add CONSTRAINT check_pages CHECK (pages >=200);
于 2013-09-23T13:10:45.203 回答
1

一种非常好的方法是使用“带有检查选项”的视图(可能还有 sys_context)。

例如,

CREATE OR REPLACE VIEW test (id, col_1) AS
SELECT id,  col_1 
  FROM some_table
 WHERE col1  = SYS_CONTEXT ('CTX', 'XYZ')
  WITH CHECK OPTION;

然后授予对视图的插入权限并撤销对表的插入权限。让用户插入到视图中。

“带检查选项”确保插入视图的所有行都通过“where 子句”。

这也是在 Oracle 标准版中处理行级安全性(如虚拟私有数据库)的好方法。

您可以创建 2 个 oracle 模式,一个拥有表和视图,一个模式将从视图中选择/插入/删除(并且无权对表执行任何操作)。

当用户登录并 bam 时设置 sys_context ......您拥有完美的行级安全性。

于 2013-09-23T13:18:04.670 回答
0

如果您有企业版,另一种处理方法是设置 Oracle 虚拟专用数据库: http ://www.oracle.com/technetwork/database/security/index-088277.html

于 2013-09-23T13:51:05.330 回答