获取连接用户的真实身份

obtain the real identity of the connected user

dxStatusbar1.Panels1.Text := DataModule2.UniConnectDialog1.Connection.Username;

...给我连接到 sql 服务器的用户名。 但是连接的用户在实际数据库中有不同的名称。

示例: 他在 sql 服务器的登录名是 'John' 并且用户映射到 'Northwind' 数据库。 然而在 'Northwind' 数据库中,他被称为 'John Smith'。 这是我试图在 dxStatusbar1.Panels1.Text 中显示的名字 (John Smith) 他连接后。

我怎样才能得到它?

编辑: 尝试了维多利亚的建议:

UserName := DataModule2.UniConnection1.ExecSQL('SELECT :Result = CURRENT_USER', ['Result']);
 dxStatusbar1.Panels[1].Text := UserName; 

但得到:

其中之一可能适合您。还没有测试过。

SELECT ORIGINAL_LOGIN()
SELECT SYSTEM_USER
SELECT SUSER_SNAME()

希望对您有所帮助。

ORIGINAL_LOGIN: Returns the name of the login that connected to the instance of SQL Server. You can use this function to return the identity of the original login in sessions in which there are many explicit or implicit context switches.

SYSTEM_USER: Allows a system-supplied value for the current login to be inserted into a table when no default value is specified.

SUSER_SNAME: Returns the login name associated with a security identification number (SID).

我找不到任何 UniDAC API way to get currently connected user name (not even for SDAC), so I would just issue a SQL command querying CURRENT_USER 并从结果中获取名称:

SELECT CURRENT_USER;

或者以 Unified SQL 方式使用 USER 函数:

SELECT {fn USER};

由于您在评论中提到了存储过程,在我看来您可能希望直接从连接对象获取此信息而不使用查询对象。如果是这样,您甚至不需要存储过程,而是直接执行这样的命令:

var
  UserName: string;
begin
  UserName := UniConnection1.ExecSQL('SELECT :Result = CURRENT_USER', ['Result']);
  ...
end;

或统一方式:

var
  UserName: string;
begin
  UserName := UniConnection1.ExecSQL('SELECT :Result = {fn USER}', ['Result']);
  ...
end;