拒绝所有系统存储过程的SQL权限

继续我原来的StackOverFlow问题 ,我们试图创build一个SQL用户(在许多2000年,2005年和2008年的服务器)与尽可能最小的权限做一个简单的“心跳检查”,以确保实例仍然活着。 我们决定执行一个简单的“SELECT @@ VERSION”的脚本。

但是,以“最小允许权限”的名义,我们希望阻止这个用户做任何其他事情。 不幸的是,即使没有添加任何明确的权限,PUBLICangular色(所有用户都是其成员)可以做很多事情。 特别:

SELECT * FROM SYSDATABASES
好吧,我可以显式地将用户添加到MASTER数据库中的db_denydatareaderangular色,以防止读取任何系统表

SP_WHO
好的,我可以明确拒绝所有SP_WHO,但SP_WHO2和所有其他系统存储过程怎么样? 我必须明确否认所有这些?

那么既然用户不能从PUBLICangular色中被删除,那么有没有其他办法可以防止系统运行存储过程,而不是每个人都明确否认?

系统存储特效甚至值得担心? 除了sp_who,我真的不希望这个用户能够看到的任何东西?

在SQL 2005及更高版本中,虽然用户可以查询系统对象,但他们只能看到他们有权访问的信息。 对于sys.databases,你只能看到你有权访问的数据库。 当你运行sp_who时,你只会看到你的会话信息。

你没事。 只是不要授予你的“心跳”帐户访问任何数据库。

试想一下,你正在运行的SELECT @@ VERSION命令是这些存储过程的一部分,所以你需要build立所有其他内置函数的完整列表,并专门阻止对它们的访问。 没有数据库服务器写入权限的用户,对数据库没有读取权限也不会造成任何破坏。

为了locking你想要的水平(我回答了你的其他问题),你最终会打破事情。

我真的不同意你的意图。

我也将心跳与健康监视器结合起来。 例如查找块,loggingCPU,使用dmv等

我也希望你在networking,服务器,个人电脑等方面多加注意。

例如,只有SQL Server,您是否使用Server端的SQL Server协议encryption? 只使用tcp? 使用组策略限制谁可以访问服务器? SQLlogin遵循域密码策略? SQL服务帐户被locking?