如何获取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_principals、sys.server_principals)的权限,普通用户默认拥有该权限。 - 把这段代码放在连接成功后的逻辑里,比如
UniConnectDialog1的OnConnect事件处理函数中,这样用户完成连接后就能自动显示真实用户名。
内容的提问来源于stack exchange,提问作者user763539




