从数据行入手保护SQL Server数据安全
2009-04-01 10:25:34 来源:WEB开发网行级别安全代码范例
首先我们作出如下假设:
◆使用SQL Server数据库(微软SQL Server 2000、2005或2008)
◆所有表中都有一个共同的字段,使用它来决定谁可以看什么数据(本例中就是department字段)
◆通过不同的用户id来加强应用程序调用数据库的安全性,而不是通过一个单一的admin用户id。
举例来说,图1所示数据结构包含:Orders表,包含一个客户名称、订单收入和销售部门;一个部门查阅表(Departments),包含父部门字段;一个用户访问表(UserAccess),在用户和他有权限查看的部门之间建立联系。用户访问表的每一行数据代表一个正确的用户/部门组合。如果一个用户有权限访问的部门下设许多子部门,那么这个父部门和每一个子部门在表中各占据一行数据。
图1 该数据库模型图显示了本例中所用到的表
让订单数据保持安全的关键是,通过SQL Server的表值型函数来保护它,该函数要求使用当前用户的id作为参数。表值型函数与其它函数一样可以接受参数,但是返回结果为一个表,而并非一个变量。在这个函数内,通过其安全属性联合要保护的表与用户访问表,将表的结果限定在与指定用户id相关的范围之内。
示例1定义了一个表值型函数,根据UserAccess表中的限制用户可以查看的内容,返回订单数量和订单的总收入。
示例1:创建保护订单数据的表值型函数的SQL语句
CREATE FUNCTION [dbo].[GetOrderSummary]
(
@User_Id VARCHAR(20)
)
RETURNS TABLE
AS
RETURN
(
SELECTcount(*) as OrderCount,
sum(OrderTotal) as Receipts
FROMdbo.Orderso
Joindbo.UserAccess ua
Ono.Department = ua.Department
WHERE ua.UserID = @User_Id
)
更多精彩
赞助商链接