代码之家  ›  专栏  ›  技术社区  ›  Clyde

SQL Server用户名函数

  •  2
  • Clyde  · 技术社区  · 16 年前

    考虑以下T-SQL:

    CREATE USER my_test_user WITHOUT LOGIN;
    SELECT USER_NAME(), USER, SUSER_SNAME(),SYSTEM_USER, suser_name();
    EXECUTE AS USER = 'my_test_user' WITH NO REVERT;
    SELECT USER_NAME(), USER, SUSER_SNAME(),SYSTEM_USER, suser_name();
    

    WITHOUT LOGIN 出于审计目的。基本上,我的“获取数据库连接”代码返回一个连接 EXECUTE AS USER...WITH NO REVERT 已经执行。

    问题是,我无法从这些用户名函数中获得一致的结果。两条输出线是:

    dbo           dbo           original_user      original_user     original_user
    my_test_user  my_test_user  S-1-9-3-XXXXX..    S-1-9-3-XXXXX..   S-1-9-3-XXXXX..
    

    USER 函数在以下时间后产生正确的输出 'EXECUTE AS' SUSER 函数正好相反——它们最初是正确的,但在模拟后,它们显示了某种ID

    MSDN文档 SUSER_SNAME

    更新:

    3 回复  |  直到 11 年前
        1
  •  4
  •   gbn    16 年前

    更新:你需要 ORIGINAL_LOGIN

    原件:

    之后,没有匹配的系统级用户。因此,它无法解析数据库级别的sid,因此它只是从以下位置返回sid sys.database_principals

    CREATE USER my_test_user WITHOUT LOGIN;
    SELECT USER_NAME(), USER, SUSER_SNAME(),SYSTEM_USER, suser_name();
    EXECUTE AS USER = 'my_test_user' WITH NO REVERT;
    SELECT USER_NAME(), USER, SUSER_SNAME(),SYSTEM_USER, suser_name(),
                            SUSER_SID();
    
    SELECT * FROM sys.database_principals WHERE sid = SUSER_SID();
    

    笔记:

    • 您将获得USER_NAME()的dbo,因为您是以sysadmin权限登录的。使用数据库级用户函数时,每个具有“sysadmin”的人都是dbo。

    • 更改用户上下文后,数据库级用户函数解析为数据库用户上下文

    • 对于系统级用户功能,您将获得之前使用的登录名

        2
  •  1
  •   Remus Rusanu    16 年前

    没有登录的用户是一种特殊情况,专门用于service broker安全(远程服务绑定)或代码签名。它们代表身份,而不是模仿。不要使用未登录的用户进行EXECUTE AS。您会遇到各种边缘情况,因为它们明确没有用户到登录的映射,而且几乎在所有需要映射的地方都有。

        3
  •  0
  •   John Lechowicz    16 年前

    这里只是猜测,但在我看来,第一个选择是以您当前登录的用户身份运行的,就像连接一样,在第二个选择中,您告诉sql server以新创建的用户身份执行。