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

如何获取SQL Server连接用户的数据库真实身份并显示到dxStatusbar?

获取SQL Server登录名对应的数据库映射用户名

要获取登录名在目标数据库中的真实映射名称,你可以通过执行SQL查询来提取这个信息,再将结果赋值给状态栏面板。以下是具体的实现步骤和代码示例:

核心思路

SQL Server里,服务器级别的登录名和数据库级别的用户是通过sid字段关联的。我们可以利用系统内置函数或系统视图,查询当前登录上下文对应的数据库用户名称。

方法一:使用内置函数USER_NAME()(简单直接)

USER_NAME()函数会直接返回当前数据库上下文的用户名,适合大多数登录名直接映射到数据库用户的场景:

var
  UserQuery: TUniQuery;
begin
  // 创建查询组件(这里用UniDAC的TUniQuery,换成ADOQuery等组件逻辑一致)
  UserQuery := TUniQuery.Create(nil);
  try
    // 指定已建立的连接对象
    UserQuery.Connection := DataModule2.UniConnectDialog1.Connection;
    // 执行获取数据库用户名的SQL语句
    UserQuery.SQL.Text := 'SELECT USER_NAME() AS DBUserName';
    UserQuery.Open;
    
    // 若查询有结果,将用户名赋值给状态栏面板
    if not UserQuery.Eof then
      dxStatusbar1.Panels[1].Text := UserQuery.FieldByName('DBUserName').AsString;
  finally
    // 释放查询组件,避免内存泄漏
    UserQuery.Free;
  end;
end;

方法二:查询系统视图(精准适配复杂映射场景)

如果用户是通过Windows组、角色等间接方式映射到数据库用户,通过关联服务器和数据库的系统视图能更准确获取真实用户名:

var
  UserQuery: TUniQuery;
begin
  UserQuery := TUniQuery.Create(nil);
  try
    UserQuery.Connection := DataModule2.UniConnectDialog1.Connection;
    // 通过sid关联服务器登录信息和数据库用户信息,匹配当前登录名
    UserQuery.SQL.Text := 
      'SELECT dp.name AS DBUserName ' +
      'FROM sys.database_principals dp ' +
      'INNER JOIN sys.server_principals sp ON dp.sid = sp.sid ' +
      'WHERE sp.name = SUSER_SNAME()';
    
    UserQuery.Open;
    if not UserQuery.Eof then
      dxStatusbar1.Panels[1].Text := UserQuery.FieldByName('DBUserName').AsString;
  finally
    UserQuery.Free;
  end;
end;

注意事项

  • 确保当前连接的用户具有查询系统视图(sys.database_principalssys.server_principals)的权限,普通用户默认拥有该权限。
  • 把这段代码放在连接成功后的逻辑里,比如UniConnectDialog1OnConnect事件处理函数中,这样用户完成连接后就能自动显示真实用户名。

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

火山引擎 最新活动