You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

SQL Server能否创建可通过应用登录但无法登录SSMS的用户?

嘿,这两个问题挺实用的,我来给你一步步拆解清楚:

问题1:如何在SQL Server中创建无法通过SSMS登录的用户?

首先得掰扯清楚SQL Server里**登录名(Login)用户(User)**的核心区别:登录名是服务器级的身份,用来连接到SQL Server实例;用户是数据库级的身份,用来访问特定数据库,通常需要和登录名绑定才能登录。

要创建无法通过SSMS登录的用户,最直接的方案是创建没有对应登录名的数据库用户——这个用户只能被其他有授权的登录名通过身份模拟来使用,本身根本没法直接登录SSMS。具体SQL语句很简单:

CREATE USER [RestrictedDBUser] WITHOUT LOGIN;

举个例子,如果你有一个管理员登录名,想要临时用这个受限用户的权限操作数据库,可以用EXECUTE AS USER = 'RestrictedDBUser';来切换身份,操作完再用REVERT;切回来。

另外,如果你说的是服务器级的登录名没法登录SSMS,那更简单,直接禁用这个登录名就行:

ALTER LOGIN [RestrictedServerLogin] DISABLE;

不过这种方式是一刀切——这个登录名连其他应用也没法用了,所以如果只是针对SSMS的话,这个方案就不太合适。


问题2:是否可以创建可通过任意应用登录,但无法使用SSMS登录的登录用户?

必须可以!核心思路就是利用**登录触发器(Login Trigger)**来“识别”SSMS的连接请求,然后直接拒绝它。

SSMS在连接SQL Server的时候,会在请求里自带特定的应用名称(一般是Microsoft SQL Server Management Studio,或者带这个字符串的变体),我们可以用APP_NAME()函数拿到这个值,然后在触发器里做判断。

具体操作分两步:

  1. 先创建一个正常的SQL身份验证登录名(用Windows身份验证也可以,逻辑一致):
CREATE LOGIN [AppOnlyLogin] WITH PASSWORD = 'YourSuperStrongPassword123!';
  1. 创建一个服务器级的登录触发器,专门拦截这个登录名的SSMS连接:
CREATE TRIGGER BlockSSMSForAppLogin
ON ALL SERVER
FOR LOGON
AS
BEGIN
    -- 只针对目标登录名,并且检测到是SSMS的连接
    IF ORIGINAL_LOGIN() = 'AppOnlyLogin' 
       AND APP_NAME() LIKE '%Microsoft SQL Server Management Studio%'
    BEGIN
        -- 直接回滚登录请求
        ROLLBACK;
    END
END;

几个要注意的点:

  • 如果你想让这个触发器作用于所有登录名(禁止所有人用SSMS登录),去掉ORIGINAL_LOGIN()的判断就行,但一般没人这么干对吧?
  • 这种方式不是绝对防作弊的——客户端应用名称是可以被伪造的,但对于大多数业务场景来说,已经足够满足“只让应用登录,不让SSMS登”的需求了。
  • 创建这个触发器需要ALTER ANY SERVER TRIGGER权限,确保你有足够的权限操作哈。

内容的提问来源于stack exchange,提问作者Yash

火山引擎 最新活动