【发布时间】:2009-05-22 15:09:52
【问题描述】:
有没有办法阻止用户进入 SQL Server Management Studio,这样他们就不能只手动编辑表行?他们仍然需要通过运行我的应用程序来访问这些表。
【问题讨论】:
-
数据库是否在同一台机器上?
标签: sql-server sql-server-2008
有没有办法阻止用户进入 SQL Server Management Studio,这样他们就不能只手动编辑表行?他们仍然需要通过运行我的应用程序来访问这些表。
【问题讨论】:
标签: sql-server sql-server-2008
您可以对特定用户使用 DENY VIEW ANY DATABASE 命令。这是 SQL Server 2008 中提供的一项新功能。
它阻止用户查看系统目录(sys.databases、sys.sysdatabases 等),因此使数据库在 SQL Management Studio (SSMS) 中对他们不可见。
从主数据库运行此命令:
DENY VIEW ANY DATABASE TO 'loginName'
用户仍然可以通过您的应用程序访问数据库。但是,如果他们通过 SSMS 登录,您的数据库将不会显示在数据库列表中,并且如果他们打开查询窗口,您的数据库将不会出现在下拉列表中。
但是,这并不是万无一失的。如果用户足够聪明,可以运行查询命令:
USE <YourDatabaseName>
然后他们将在查询分析器中看到数据库。
由于此解决方案将您 90% 带到那里,我会给数据库一些晦涩的名称,而不是让用户知道数据库的名称。
【讨论】:
您不必担心他们可以访问该工具。只需确保他们不知道具有读/写权限的特定数据库的任何 SQL 登录名,如果知道,请更改密码。如果他们可以通过 Windows 身份验证访问数据库,请确保他们处于 datareader 角色。您可以使用角色来管理用户可以在 SQL 中执行的操作。
【讨论】:
您可以使用触发器。
CREATE TRIGGER [TR_LOGON_APP]
ON ALL SERVER
FOR LOGON
AS
BEGIN
DECLARE @program_name nvarchar(128)
DECLARE @host_name nvarchar(128)
SELECT @program_name = program_name,
@host_name = host_name
FROM sys.dm_exec_sessions AS c
WHERE c.session_id = @@spid
IF ORIGINAL_LOGIN() IN('YOUR_APP_LOGIN_NAME')
AND @program_name LIKE '%Management%Studio%'
BEGIN
RAISERROR('This login is for application use only.',16,1)
ROLLBACK;
END
END;
【讨论】:
我建议您锁定数据库并授予用户适当的只读(或其他)权限。这样用户仍然可以使用管理工作室来运行选择查询等。
如果您根本不希望用户拥有任何权利,那么您也可以这样做。
【讨论】:
如果您的应用程序作为服务/用户帐户运行,则只有该帐户需要访问数据库。个人用户的帐户不需要对数据库的任何访问权限,因此他们甚至没有读取权限。您的应用将成为数据的门户。
如果用户在其用户帐户下运行应用程序,则授予他们只读权限。您只需将它们添加到 db_datareader 角色即可。
希望这会有所帮助!
【讨论】:
您可以拒绝“用户”对 ssms.exe 可执行文件的访问权限,同时授予相关用户/管理员权限。
【讨论】:
如果您的应用程序仅使用存储过程来修改数据,您可以授予最终用户运行存储过程的权限,但拒绝他们修改表的权限。
【讨论】:
【讨论】:
Application Role 将允许您将数据库对象保护到您的应用程序而不是登录用户。
【讨论】:
我同意Jon Erickson 作为一般规则
【讨论】:
充分利用数据库角色,如果用户应该只有 SELECT(读取)访问权限,请为他们分配 db_datareader 角色。即使他们使用 SSMS 登录,他们也只能执行 SELECT 语句。
【讨论】: