SQLServer数据库之每个程序员都需要了解的一个SQL技巧
小标 2019-05-24 来源 : 阅读 2665 评论 1

摘要:本文主要向大家介绍了SQLServer数据库之每个程序员都需要了解的一个SQL技巧,通过具体的内容向大家展现,希望对大家学习SQLServer数据库有所帮助。

本文主要向大家介绍了SQLServer数据库之每个程序员都需要了解的一个SQL技巧,通过具体的内容向大家展现,希望对大家学习SQLServer数据库有所帮助。

SQLServer数据库之每个程序员都需要了解的一个SQL技巧

对于数据过滤而言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的执行。如果你的数据库没有本地提供行级别的安全性的话,这也是一个实现多租户的不错的方式。

   

本文由职坐标整理并发布,希望对同学们学习SQL Server有所帮助,更多内容请关注职坐标数据库SQL Server数据库频道!

本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(1)
后参与评论
职侃
向视图插入数据,这种方法要写到实际项目里,会坑死人的吧。
2020/10/14 11:28:03

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-IT技术咨询与就业发展一体化服务 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程