我看过一些指南,建议您通过存储过程对所有数据访问进行分层来保护数据库。
我知道对于 SQL Server,您可以保护表,甚至是针对 CRUD 操作的列。
例如:
--// Logged in as 'sa'
USE AdventureWorks;
GRANT SELECT ON Person.Address(AddressID, AddressLine1) to Matt;
GRANT UPDATE ON Person.Address(AddressLine1) to Matt;
--// Logged in as 'Matt'
SELECT * from Person.Address; --// Fail
SELECT AddressID, AddressLine1 from Person.Address; --// Succeed
UPDATE Person.Address SET AddressLine1 = '#____ 2700 Production Way'
WHERE AddressID = 497; --// Succeed
鉴于您可以针对 CRUD 操作保护表甚至列,使用存储过程如何提供额外的安全性或安全性管理?
最佳答案
因为通过限制对那些存储过程的所有访问,您已经为数据库建立了一个定义的接口(interface),所有访问都必须通过该接口(interface)发生......因为您将拒绝直接针对表和 View 的选择、插入、更新和删除操作,没有人可以直接编写自己设计的sql,为所欲为...如果您想将员工分配到三个以上项目的员工表中的插入限制为仅那些得分大于85 在熟练程度测试中,然后您可以将该约束写入 SaveEmployee sproc,并让它向任何尝试执行此操作的客户端代码抛出异常...
当然,您可以使用客户端代码做同样的事情,但是使用 sProcs 使流程更易于设计和管理,因为它都在一个地方,并且所有尝试访问此数据库系统的应用程序都必须符合任何约束和/或您在 SProcs 中定义的安全条款...如果 SProc 是插入或更新数据的唯一方法,那么编写一个新的独立客户端应用程序来访问数据库的流氓开发人员可以忽略或绕过 SProc 中的约束或安全条款记录...
关于sql - 使用存储过程访问数据提供了哪些安全优势?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/421553/