每个开发人员都需要了解的一个SQL技巧

简介:

对于数据过滤而言CHECK约束已经算是相当不错了。然而它仍存在一些缺陷,比如说它们是应用到表上面的,但有的时候你可能希望指定一条约束,而它只在特定条件下才生效。

使用SQL标准的WITH CHECK OPTION子句就能完成这点,至少Oracle和SQL Server都实现了这个功能。下面是实现方式:

 
  1. CREATE TABLE books (
  2. id NUMBER(10) NOT NULL,
  3. title VARCHAR2(100 CHAR) NOT NULL,
  4. price NUMBER(10, 2) NOT NULL,
  5. CONSTRAINT pk_book PRIMARY KEY (id)
  6. );
  7. /
  8. CREATE VIEW expensive_books
  9. AS
  10. SELECT id, title, price
  11. FROM books
  12. WHERE price > 100
  13. WITH CHECK OPTION;
  14. /
  15. INSERT INTO books
  16. VALUES (1, '1984', 35.90);
  17. INSERT INTO books
  18. VALUES (
  19. 2,
  20. 'The Answer to Life, the Universe, and Everything',
  21. 999.90
  22. );

正如你看到的那样,expensive_books 是那些价格大于100块的书。这个视图只会返回第二本书:

 
  1. SELECT * FROM expensive_books;

上述查询的输出是:

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

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

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

它是无法生效的。你会看到:

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

我们也无法将贵的书更新成便宜的:

 
  1. UPDATE expensive_books
  2. SET price = 9.99;

这个查询也会报出同样的ORA-01402错误。

WITH CHECK OPTION内联

如果你需要局部防止脏数据被插入到表中,你可以使用WITH CHECK OPTION的内联子句:

 
  1. INSERT INTO (
  2. SELECT *
  3. FROM expensive_books
  4. WHERE price > 1000
  5. WITH CHECK OPTION
  6. ) really_expensive_books
  7. VALUES (3, 'Modern Enterprise Software', 999.99);

上述查询同样也会导到ORA-01402错误。

使用SQL转换来生成特殊约束

CHECK OPTION对于已存储的视图非常有用,它使得那些无权直接访问底层表的用户能够获得正确的授权,而内联的CHECK OPTION主要是在应用的SQL中间转换层来进行动态SQL的转换。

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

原文发布时间为:2015-07-15



本文来自云栖社区合作伙伴“Linux中国

目录
相关文章
|
SQL 运维 测试技术
SQL Server自动化运维系列——关于邮件通知那点事(.Net开发人员的福利)
原文:SQL Server自动化运维系列——关于邮件通知那点事(.Net开发人员的福利) 需求描述 在我们的生产环境中,大部分情况下需要有自己的运维体制,包括自己健康状态的检测等。如果发生异常,需要提前预警的,通知形式一般为发邮件告知。
5239 0
|
SQL 存储 BI
SQL点滴17—使用数据库引擎存储过程,系统视图查询,DBA,BI开发人员必备基础知识
原文:SQL点滴17—使用数据库引擎存储过程,系统视图查询,DBA,BI开发人员必备基础知识    在开发过程中会遇到需要弄清楚这个数据库什么时候建的,这个数据库中有多少表,这个存储过程长的什么样子等等信息,今天把自己工作过程中经常用到的一些数据库引擎存储过程,系统视图等等总结一下以备不时之用。
1053 0
|
SQL 测试技术 数据库管理
关于评审开发人员的sql语句
在平时的工作中,经常会有一些开发人员提出一些数据库相关的一些问题。可能问的最多的就是sql语句了。 按照一个标准的流程,开发提交的sql语句在完成一系列测试之后,在生产部署前,还需要dba来进行审核。
752 0
|
SQL BI 数据安全/隐私保护
防止开发人员获取到敏感数据(SQL Server的数据加密简介)
原文 http://www.cnblogs.com/guogangj/p/3365614.html 背景 有时候,我们还真的会碰到这样的需求:防止开发人员获取到敏感数据。也许你觉得很简单,把开发和运营分开不就可以了吗?是的,如果公司有专门的运营 团队的话,但对于很多小公司来说,几个人的开发团队就兼顾了需求分析、设计、开发、测试、调试、部署和运营了,数据库密码知道,程序代码全有,怎么办? ——必须对数据库里的数据进行加密,这是唯一的办法。
791 0
|
SQL 存储 BI
SQL点滴17—使用数据库引擎存储过程,系统视图查询,DBA,BI开发人员必备基础知识
   在开发过程中会遇到需要弄清楚这个数据库什么时候建的,这个数据库中有多少表,这个存储过程长的什么样子等等信息,今天把自己工作过程中经常用到的一些数据库引擎存储过程,系统视图等等总结一下以备不时之用。
921 0
|
1天前
|
SQL 存储 数据库连接
LabVIEW与SQL Server 2919 Express通讯
LabVIEW与SQL Server 2919 Express通讯
|
1天前
|
SQL Windows
安装SQL Server 2005时出现对性能监视器计数器注册表值执行系统配置检查失败的解决办法...
安装SQL Server 2005时出现对性能监视器计数器注册表值执行系统配置检查失败的解决办法...
11 4