博主信息
Sky
博文
291
粉丝
0
评论
0
访问量
6712
积分:0
P豆:617

每个程序员都需要了解的一个SQL技巧

2021年10月21日 19:03:06阅读数:13博客 / Sky

对于数据过滤而言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块的书。这个视图只会返回第二本书:

SELECT * FROM expensive_books;

上述查询的输出是:
ID TITLE                                       PRICE
-- ----------------------------------------- -------
2 The Answer to Life, the Universe, and ...   999.9

不过由于我们使用了CHECK OPTION,我们还能防止用户往”昂贵的书籍”中插入那些廉价的。比如说,我们运行下这个查询:

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内联

如果你需要局部防止脏数据被插入到表中,你可以使用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对于已存储的视图非常有用,它使得那些无权直接访问底层表的二手手机拍卖用户能够获得正确的授权,而内联的CHECK OPTION主要是在应用的SQL中间转换层来进行动态SQL的转换。

这个可以通过jOOQ的SQL转换功能来完成,比如说,你可以在SQL语句中对某个表进行约束,从根本上阻止了非法DML的执行。如果你的数据库没有本地提供行级别的安全性的话,这也是一个实现多租户的不错的方式。

版权申明:本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!

全部评论

文明上网理性发言,请遵守新闻评论服务协议

条评论
  • 微信小应用越来越多,很多商家开始布局小,这样就大量开发人!那有没有适合小白学习呢?
    ❝本文使用Go来实现字符串逆功能,用最简单话术让你理附带在Go中debug例如:Hello  转换为  olleH❞、实现字符串在go中,字符串根据索引获取值是转为字节
    学php哪培训机构好?
    定时任务是操作系统提供给我们非常好功能,我们经常用定时任务来处理些事情,比如天定时备份网站数据、月执行下数据统计、监控服务器运行情况(发生错误时给管理发消息通知)等等,这些定时任务来完成
    应用漏洞,前端调试人秃头之源。如果您直从事前端工作,就会知道修复应用漏洞有多么困难。特别是使用JavaScript时,很小错误有时可能小时来调试。
    学习PHP有半打代码and写笔记。学过C和Java,在学习PHP中比较顺利吧(^-^)代码打得越多,运行得越多,慢慢得会对得越深。下面就讲讲我学习PHP心得。