【问题标题】:How to disable SQL Server Management Studio for a user如何为用户禁用 SQL Server Management Studio
【发布时间】:2009-05-22 15:09:52
【问题描述】:

有没有办法阻止用户进入 SQL Server Management Studio,这样他们就不能只手动编辑表行?他们仍然需要通过运行我的应用程序来访问这些表。

【问题讨论】:

  • 数据库是否在同一台机器上?

标签: sql-server sql-server-2008


【解决方案1】:

您可以对特定用户使用 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% 带到那里,我会给数据库一些晦涩的名称,而不是让用户知道数据库的名称。

【讨论】:

  • 如果你想 DOWNVOTE,那很好,但要足够成熟和有礼貌,就你为什么认为我错了发表评论。
  • 这并不是说他们需要通过他们的应用程序获得 只读 访问权限,而是说他不希望他们能够通过 SSMS 手动编辑表格
【解决方案2】:

不必担心他们可以访问该工具。只需确保他们不知道具有读/写权限的特定数据库的任何 SQL 登录名,如果知道,请更改密码。如果他们可以通过 Windows 身份验证访问数据库,请确保他们处于 datareader 角色。您可以使用角色来管理用户可以在 SQL 中执行的操作。

【讨论】:

  • 我需要连接到数据库并做一些事情,但只能使用内部应用程序。与管理层无关。
【解决方案3】:

您可以使用触发器。

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;

https://www.sqlservercentral.com/Forums/1236514/How-to-prevent-user-login-to-SQL-Management-Studio-#bm1236562

【讨论】:

  • 这似乎是直接解决 OP 问题的最佳答案。
  • 此解决方案是否存在任何性能问题?
  • 据我所知没有。对会话表的 SELECT 是由集群索引键进行的,因此它会进行索引查找。
  • 我需要禁用所有使用 SQL 登录的用户,同时只允许通过应用程序连接,所以我添加了 select isNTUser from master.dbo.syslogins where sid=USER_SID() 查询,对于 SQL 登录,isNTUser 为 false ,限制访问特定程序名称。
【解决方案4】:

我建议您锁定数据库并授予用户适当的只读(或其他)权限。这样用户仍然可以使用管理工作室来运行选择查询等。

如果您根本不希望用户拥有任何权利,那么您也可以这样做。

【讨论】:

    【解决方案5】:

    如果您的应用程序作为服务/用户帐户运行,则只有该帐户需要访问数据库。个人用户的帐户不需要对数据库的任何访问权限,因此他们甚至没有读取权限。您的应用将成为数据的门户。

    如果用户在其用户帐户下运行应用程序,则授予他们只读权限。您只需将它们添加到 db_datareader 角色即可。

    希望这会有所帮助!

    【讨论】:

      【解决方案6】:

      您可以拒绝“用户”对 ssms.exe 可执行文件的访问权限,同时授予相关用户/管理员权限。

      【讨论】:

        【解决方案7】:

        如果您的应用程序仅使用存储过程来修改数据,您可以授予最终用户运行存储过程的权限,但拒绝他们修改表的权限。

        【讨论】:

          【解决方案8】:
          • 不要让他们知道数据库登录是什么。
          • 如果您无法限制登录,请仅使用存储过程进行更新,并禁用该用户的任何 CREATE、DELETE、INSERT 或 UPDATE 权限。

          【讨论】:

            【解决方案9】:

            Application Role 将允许您将数据库对象保护到您的应用程序而不是登录用户。

            【讨论】:

              【解决方案10】:

              我同意Jon Erickson 作为一般规则

              • 不允许任何用户访问表,只允许通过存储过程进行访问
              • 不允许一般用户帐户访问存储的过程,而只允许您的应用运行时使用的帐户(无论是集成登录还是 SQL 登录)

              【讨论】:

                【解决方案11】:

                充分利用数据库角色,如果用户应该只有 SELECT(读取)访问权限,请为他们分配 db_datareader 角色。即使他们使用 SSMS 登录,他们也只能执行 SELECT 语句。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2019-08-19
                  相关资源
                  最近更新 更多