这是一个很长的问题,但请相信我,因为我认为它引发了有关数据库所有权和访问权的重要问题。
我管理和国际营销一个“通用”地热数据管理程序,用Delphi编写,它是SQL Server数据库的前端。数据库中的数据来自程序用户在30年或更长时间内生成和使用的许多不同测量 - 即他们“拥有”数据,数据库主要是一种有效存储和管理数据的方法。
与所有数据库一样,数据库结构需要不时修改,包括新表,并且通过发布新版本的程序来提供此修改。程序提示进行数据库升级,必须由dbo用户执行,以便其他程序用户可以访问所有新表。遗憾的是,该程序可能在远程站点中使用,并且IT人员可能不容易获得,因此可能会安装新版本但不升级数据库。在这些位置经常发生的事情是程序用户将在没有适当的SQL Server权限的情况下升级数据库,然后其他用户无法访问新表并且程序崩溃。
其中一位计划客户采取了另一种方法。他们为程序使用的所有数据库创建了db_owner角色,然后使所有程序用户成为db_owner角色的成员。该程序具有内置的权限级别,可以限制升级数据库的能力,因此通常只有一个或两个用户具有此权限。但是,如果每个人都是db_owner角色的成员,那么升级数据库的用户并不重要,所有程序用户都可以访问所有表。
这种方法的优点包括:
访问权限可由使用该程序的组授予,并且对数据库负有最终责任。
当员工变更时,程序用户组内会传授对程序的知识和理解,而不是依赖IT部门作为“如何运作”信息的存储库(通常他们不知道)
选定的用户专家可以进行直接数据挖掘和后门数据修改。虽然该程序具有广泛的数据集和编辑工具,但有时这些还不够,用户需要亲自动手访问。
程序用户保留其数据的“所有权”。
感谢您的评论。我相信在这些情况下,所有数据库用户都是db_owners并且用户组控制访问权限非常重要。不允许db_owner角色(IT部门通常采用的策略)无法识别数据所有权和数据可访问性的重要性,以及数据库用户管理自己数据的责任。
答案 0 :(得分:0)
你说出问题的方式听起来好像你已经得出结论了。当有人来找我(DBA)这种情况时,我总是会问的一个问题是:如果有人意外删除数据,我是否可以将其取回?如果答案是“是”,那么他们就不会得到db_owner。如果答案是“否”,那么数据库将被移动到自己的服务器,我会以书面形式获得合同。
答案 1 :(得分:0)
我唯一不想理解访问控制的是使用在SqlExpress
等本地单用户数据库上运行的简单应用程序。只要集中式数据库上有多个用户和要保护的重要数据,限制访问就很重要。我不熟悉您的域名(地热数据管理),但这些数据肯定对您的客户很重要,从完整性,篡改甚至数据访问的角度来看(数据被盗可以转售给竞争对手)。
该程序可能在远程站点中使用,而IT人员可能不会 随时可用,以便新版本可以安装但是 数据库未升级
(即我假设升级脚本需要在数据库上手动和独立运行)。现在,应用程序检查数据库以进行模式版本控制甚至静态数据填充是常见的,例如, .net堆栈上的Entity Framework code-first migrations。然后,该应用程序将能够自动实际执行架构和数据升级。将数据库升级脚本的最后N个版本添加到应用程序然后进行版本检查应该非常简单? (显然,应用程序本身需要提示dbo
访问,假设即使应用程序不应该具有dbo访问权限。
如果每个人都是db_owner角色的成员,那么谁也无所谓 升级数据库
我认为这可能会给不合格的客户用户带来不必要的责任(和权力)。
即使是临时数据挖掘(SELECT
)访问也应该重新考虑,因为如果形成错误的查询而不考虑会导致性能下降或阻止其他并发写入者。如果不出意外,提供一些格式良好的视图至少可以确保正确的查询计划。
/ 10C