SQL Server 用户名函数

标签 sql sql-server security auditing

考虑这个 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' 之后生成正确的输出,但在此之前它们显示 dbo 而不是用户名 SUSER 函数正好相反 - 它们最初是正确的,但在模拟之后它们会显示某种 ID

SUSER_SNAME 的 MSDN 文档明确给出一个应该起作用的示例。

更新:我正在寻找一个函数,该函数将在第一种情况下生成“original_user”,在第二种情况下生成“my_test_user”。

最佳答案

更新:您需要 ORIGINAL_LOGIN fn 也在这里

原文:

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

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”的每个人都是 dbo。

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

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

关于SQL Server 用户名函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1579025/

相关文章:

asp.net - MS SQL 2000 还是 MySQL 5.0?

javascript - jQuery 删除输出循环上的重复行

sql - 如何根据WHERE条件计算值连续出现的次数?

MySQL : How to perform multiple calculations and group by two columns?

asp.net - 用于连接到 SQL Server 并以 JSON 格式返回响应的 Web API

sql - 如何通过 SQL 查询从 XML 中的键值对检索值?

sql - SSIS 在更新期间挂起,有 300 万行

php - 安全类(class) build

security - 通过代理实现 SSL

web-services - 为什么 Web 服务安全需要单独的标准?