在此版本的 SQL Server 中无法使用参数调用“SUSER_SNAME”

Fra*_*ani 4 sql-server t-sql azure-sql-database azure

我正在阅读这篇博客文章,其中包含一个查询,可以让您找到 a 何时DROP被解雇。我更改LIKE 'DROPOBJ%'NOT LIKE 'DROPOBJ%'这样我可以返回更多行:

SELECT [Current LSN]
        ,[Operation]
        ,[Context]
        ,[Transaction ID]
        ,[Description]
        ,[Begin Time]
        ,[Transaction SID]
        ,[Transaction Name]
FROM fn_dblog (NULL,NULL)
INNER JOIN(SELECT [Transaction ID] AS tid
FROM fn_dblog(NULL,NULL)
WHERE [Transaction Name] NOT LIKE 'DROPOBJ%')fd ON [Transaction ID] = fd.tid
Run Code Online (Sandbox Code Playgroud)

该查询在 Azure SQL 数据库上轻松执行,但是当我尝试将SUSER_SNAME博客文章中所述的内容添加到代码中时:

SELECT [Current LSN]
        ,[Operation]
        ,[Context]
        ,[Transaction ID]
        ,[Description]
        ,[Begin Time]
        ,[Transaction SID]
        ,SUSER_SNAME ([Transaction SID]) AS WhoDidIt
FROM fn_dblog (NULL,NULL)
INNER JOIN(SELECT [Transaction ID] AS tid
FROM fn_dblog(NULL,NULL)
WHERE [Transaction Name] NOT LIKE 'DROPOBJ%')fd ON [Transaction ID] = fd.tid
Run Code Online (Sandbox Code Playgroud)

Azure SQL 数据库返回错误:

Msg 40507, Level 16, State 1, Line 1
'SUSER_SNAME' cannot be invoked with parameters in this version of SQL Server.
Run Code Online (Sandbox Code Playgroud)

我认为这一定是因为SUSER_SNAMEAzure SQL 数据库不支持,但如果我去查看文档,会说:

SUSER_NAME 始终返回当前安全上下文的登录名。SUSER_SNAME 语句不支持通过 EXECUTE AS 使用模拟安全上下文执行。

但在这里我没有使用EXECUTE AS,事实上如果我运行:

SELECT SUSER_SNAME();  
GO 
Run Code Online (Sandbox Code Playgroud)

一切都很好,查询返回我的电子邮件:

在此输入图像描述

我这里哪里错了?

Dan*_*man 8

文档SUSER_NAME不完整。SUSER_NAMEAzure SQL 数据库中的不支持该server_user_sid参数。我提交了文档更改的拉取请求。

尝试加入sys.database_principals而不是使用服务器范围的函数。这将获取数据库范围的主体的名称。

SELECT 
         l.[Current LSN]
        ,l.[Operation]
        ,l.[Context]
        ,l.[Transaction ID]
        ,l.[Description]
        ,l.[Begin Time]
        ,l.[Transaction SID]
        ,dp.name AS WhoDidIt
FROM fn_dblog (NULL,NULL) l
INNER JOIN(SELECT [Transaction ID] AS tid
    FROM fn_dblog(NULL,NULL)
    WHERE [Transaction Name] NOT LIKE '%DROPOBJ%') AS fd ON l.[Transaction ID] = fd.tid
LEFT JOIN sys.database_principals AS dp ON dp.sid = l.[Transaction SID];
Run Code Online (Sandbox Code Playgroud)

我看到dbo由我(管理员)进行的架构更改的用户和其他数据库用户所做的更改的其他用户名(使用 . 创建)CREATE USER UserName WITH PASSWORD=...。对于非数据库范围的主体(例如系统进程),该值为 NULL。