sql 视图嵌套视图_很棒SQL技巧:视图约束

本文介绍了如何使用SQL视图嵌套和检查选项来创建临时约束,以限制对特定数据的修改,例如阻止插入不符合条件的记录。通过示例展示了在Oracle和SQL Server中如何应用这些约束,并探讨了在Java应用程序中使用jOOQ进行SQL转换以实现行级安全性的方法。
摘要由CSDN通过智能技术生成

sql 视图嵌套视图

当您要清理数据时, CHECK约束已经相当不错了。 但是CHECK约束有一些限制,包括它们应用于表本身的事实,有时您希望指定仅在某些情况下适用的约束。

这可以通过SQL标准WITH CHECK OPTION子句完成,该子句至少由Oracle和SQL Server实现。 这样做的方法如下:

CREATE TABLE books (
  id    NUMBER(10)         NOT NULL,
  title VARCHAR2(100 CHAR) NOT NULL,
  price NUMBER(10, 2)      NOT NULL,
  
  CONSTRAINT pk_book PRIMARY KEY (id)
);
/

CREATE VIEW expensive_books
AS
SELECT id, title, price
FROM books
WHERE price > 100
WITH CHECK OPTION;
/

INSERT INTO books 
VALUES (1, '1984', 35.90);

INSERT INTO books 
VALUES (
  2, 
  'The Answer to Life, the Universe, and Everything',
  999.90
);

正如您所看到的, expensive_books是所有价格超过100.00的书。 该视图仅报告第二本书:

SELECT * FROM expensive_books;

上面的查询产生:

ID TITLE                                       PRICE
-- ----------------------------------------- -------
 2 The Answer to Life, the Universe, and ...   999.9

但是现在,有了“检查选项”,我们还可以防止用户插入并非真正昂贵的“昂贵书”。 例如,让我们运行以下查询:

INSERT INTO expensive_books 
VALUES (3, '10 Reasons why jOOQ is Awesome', 9.99);

此查询现在无法使用。 我们得到:

ORA-01402: view WITH CHECK OPTION where-clause violation

我们也不能将任何“昂贵的书”更新为非昂贵的:

UPDATE expensive_books
SET price = 9.99;

此查询导致相同的ORA-01402错误消息。

内联检查选项

如果需要本地防止将假数据插入表中,则还可以使用内联WITH CHECK OPTION子句,如下所示:

INSERT INTO (
  SELECT *
  FROM expensive_books
  WHERE price > 1000
  WITH CHECK OPTION
) really_expensive_books
VALUES (3, 'Modern Enterprise Software', 999.99);

上面的查询再次导致ORA-01402错误。

使用SQL转换生成临时约束

尽管CHECK OPTION对于存储视图非常有用,可以为那些可能无法直接访问基础表的用户提供适当的授权,但是当您在应用程序的中间SQL转换层中转换动态SQL时,内联CHECK OPTION主要有用。

例如,这可以通过jOOQSQL转换功能来完成,您可以在其中监视SQL语句中的特定表,然后集中阻止执行虚假的DML。 如果您的数据库本身不支持行级安全性,那么这是实现多租户的好方法。

请继续关注未来的博客文章,其中解释了如何使用jOOQ转换SQL以实现任何数据库的行级安全性。

翻译自: https://www.javacodegeeks.com/2014/09/awesome-sql-trick-constraints-on-views.html

sql 视图嵌套视图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值