在SQL Server中,有时出于安全考虑,需要移除服务器的写权限,并且只有少数人能够以完全权限访问服务器。然而,这种做法对开发者来说并不友好,因为他们在开发和测试过程中需要使用服务器进行各种活动。一旦移除了写权限,大多数用户将无法查看数据库对象的内容,例如存储过程、视图等。
因此,需要满足一个需求,即允许开发者访问模式,以便他们可以查看内容,并且可以执行存储过程(在使用Profiler调试流程时需要),但不允许任何人更改或添加任何新的数据库对象,也不直接更新现有表中的数据。
最简单的解决办法是创建一个具有读取权限的SQL用户登录,并为该登录授予执行权限。
1. 创建一个SQL登录。
2. 仅保留为这个SQL登录选择‘public’服务器角色。
3. 选择‘db_datareader’角色成员资格。
使用上述创建的登录连接到SQL Server后,将看到只允许进行只读操作。将能够查看表、视图(无法查看底层SQL代码)。存储过程将被隐藏。
在示例数据库(AdventureWorks)中创建了以下存储过程,用于测试目的。
CREATE PROCEDURE ReadOnlyUserProc
AS
BEGIN
SELECT GETDATE() AS CurrentDate
END
当以‘readonlyuser’身份执行上述存储过程时,将得到以下错误:
EXEC ReadOnlyUserProc
现在,让提供必要的访问权限,以便可以使用该登录来执行存储过程,并查看数据库对象的模式。使用以下代码为之前创建的用户授予执行访问权限。
USE AdventureWorks
GO
GRANT EXECUTE TO readonlyuser
GO
现在当执行存储过程时,将得到所需的结果。
EXEC ReadOnlyUserProc
然而,仍然无法看到SQL对象的模式,这是在这个练习中想要的一部分。
如果尝试通过右键单击对象来生成脚本,将得到一个错误消息:
将尝试解决这个问题。请按照以下步骤操作:
1. 右键单击登录,然后转到属性窗口。
2. 转到‘Securables’选项卡,并勾选‘Grant’复选框以选择‘View any definition’。
3. 点击‘OK’