我希望使用用户模拟来设置一个具有修改 DDL 权限的用户,只有当我需要部署 DDL 更改时,我才会模拟该用户。这样我就可以使用我的 Windows 集成帐户根据需要查询数据,但不能修改数据库,除非我明确地模拟其他用户。
根据有关模拟的 MSDN 文章,如果您是系统管理员,则只能执行模拟。
所以挑战是,如果我的默认登录名,我们称之为 LoginAaron,是数据库的系统管理员,如何拒绝我自己的 DDL 写入权限,这样我就无法在不显式模拟另一个具有 ddl_admin 角色的用户的情况下执行 DDL(我们将调用用户 UserDdlDeploy)?
还是有另一种优雅的方式来实现这一点?
这与其说是安全程序,不如说是安全/预防程序。
A
sysadmin
不能暂时/大部分时间/等等。你想做的是创建一个你大部分时间使用的 SQL 身份验证登录,它只有权限做你想做的有限事情。然后,当您要执行 DDL 操作时,以您的 Windows 登录身份登录。如果您的主要登录名不是,可能有一些方法可以做到这一点
sysadmin
,但我认为它们会弄巧成拙。每当您想做任何事情时,您都必须以其他人的身份登录(包括您希望低权限登录能够做的事情,但在设置权限时没有预见到)。举个简单的例子,这里有两个数据库主体,其中一个可以模拟另一个:结果:
(现在,模拟并不完美——例如,当您需要跨数据库边界访问资源时,使用它会出现问题。)
因此,假设那些是真正的用户与真实的登录挂钩,您可以只添加
blat
到ddl_admin
角色,并在floob
大多数时间登录。当你需要的时候,你可以简单地模仿blat
,做你的 DDL 事情,然后恢复。我的建议是不要试图降低您的 Windows 帐户 / 的权限sysadmin
,而是习惯于以不同的方式登录,这样您就可以在大多数时间成为一名苦工,并且只在需要时提升权限。不过,我要重复一遍,无论如何,这不会消除您在任何情况下都会犯的错误——它只会防止您意外运行 DDL,或运行错误的 DDL,这在您故意模仿时也可能发生。而且,因为只有在需要时才提升自己的特权以保护自己的想法,因为你认为只有在不提升特权时才会犯错误,这对我来说很奇怪,而且我无能为力(信用xkcd,当然):
这是一个更具体的示例,它使用了真正的 SQL 身份验证登录。
现在,创建一个新会话,直接使用
peon
/登录peon
,然后运行以下代码:休息,对吧?是的当然:
现在,您可以冒充另一个用户,而不是
sysadmin
,因此您应该针对任何文档告诉您的内容提交错误:不要忘记清理: