操作系统集成安全性()
在第一个计算机数据库发明之前OS就已经存在了记住这一点很重要没有任何RDBMS能在没有OS的支持下运行每一种OS都具有自己的一套安全机制本书所讨论的所有RDBMS在某种程度上都提供了与运行这些RDBMS的OS的安全集成从本质上讲可以直接使用OS账户和特权来访问数据库而无须依赖于RDBMS
例如Microsoft SQL Server 具有紧密集成OS的安全性对于具有有效Windows账户的用户允许根据他们的Windows NT//XP凭据进行身份验证采用Windows身份验证的用户无须提供独立的用户ID和密码只要他登录了运行RDBMS的计算机就可以自动地访问SQLServer
其他RDBMS将该功能扩展到了多个操作系统对于不同的系统实现的细节和用法也有所差异
运行在某些操作系统(特别是Windows x)上的RDBMS不具有OS集成的安全性因为这些OS本身没有提供这样的功能
使用视图提供安全性
SQL视图是用来实现安全性的机制之一视图可以限制用户所能访问的数据或者限制用户所能执行的操作类型也可以同时对两者进行限制
请考虑下面的DDL SQL语句该语句非常通用可以被所有RDBMS接受
CREATE VIEW vw_SingleTable
AS
SELECT
bk_publisher AS Publisher
bk_title AS Title
bk_pub_year AS Year_of_Publication
FROM books
BOOKS表中总共包含了个字段但该视图仅从表中选取了个字段这也称为纵向限制因为它将访问范围限制为列(字段)的一个子集其他列可能包含了不想让用户看到的机密信息如果将该视图的SELECT特权授予某个角色(例如friends角色)则属于该角色的每一个用户都可以看到视图中的信息BOOKS表中的其余信息对于这些用户则保持不可访问状态
通过声明行的子集还可以为数据提供横向的限制例如你可能想授予访问历史数据(即那些在一年或更早之前输入到表中的记录)的特权并禁止对该日期之后添加的数据进行访问如果使用LIBRARY数据库的例子假设想快速而简单地访问价格低于某一标准例如美元的图书那么可以使用下面的代码这些SQL语法对于所有RDBMS都是可用的
CREATE VIEW vw_cheap_books
AS
SELECT *
FROM books
WHERE bk_price <
从该视图中选取数据将仅仅返回那些价格低于美元的图书
当然在单个视图中可以同时结合纵向和横向的选取限制
在视图中还可以实现其他方面的限制即使用WHERE子句和JOIN条件当在视图中涉及多个表时这两个子句是非常有用的例如可以限制视图使之仅显示所着图书的售价低于美元的作者
SELECT DISTINCT bkbk_title baau_last_name
FROM books bk
JOIN
books_authors ba
ON bkbk_id= babk_id
JOIN
authors au
ON baau_id = auau_id
WHERE
Bkbk_price <
视图不仅可用于SELECT语句而且也可用于UPDATE INSERT和DELETE语句其中一些操作由视图对象固有的属性所支配另外一些操作则可以在创建该视图对象时声明例如如果在创建视图时使用了聚合函数则无法向视图更新或插入数据试图执行这些操作将产生一个错误这是视图固有的行为另一方面对于可更新视图可以创建一个约束根据某些标准接受或拒绝对数据的修改
试一试使用SQL视图限制数据访问
在下面的练习中将创建一个视图限制用户仅能查看到当前年份之前输入的图书记录在这个例子中采用了Microsoft SQL Server 请参考wwwwroxcom或者wwwagilitatorcom网站以了解针对你所使用的特定RDBMS的例子
() 打开Microsoft SQL Server的Query Analyzer
() 在SQL Query窗格中输入USE [library]作为第一条语句
() 输入下面的代码
CREATE VIEW vwLastYearBooks AS
SELECT * FROM books where EXTRACT(PublishingDate YEAR) < EXTRACT
(GetDate() YEAR)
GO
返回目录SQL实战新手入门
编辑推荐
Oracle索引技术
高性能MySQL
数据仓库与数据挖掘培训视频教程