如何通过SQL查询InterSystems Caché中用户可用的命名空间列表?
解决C#连接InterSystems Caché获取用户可用命名空间的权限问题
问题原因
%SYS.Namespace_List() 需要 %Admin_Manage 级别的权限,即使是system用户,若未配置该权限也会触发权限违例错误。而你需要的是当前用户实际可用的命名空间列表,而非系统所有命名空间,因此应使用专为普通用户设计的查询方式。
解决方案
使用 %SYS.Namespace_UserList() 函数替代原查询,该函数会返回当前用户有权限访问的所有命名空间,无需额外高权限。
修改后的代码示例
namespace ConsoleApp13 { internal class Program { static void Main(string[] args) { var CS = "Server=XXXXX;User=system;Password=sys;"; var C = new InterSystems.Data.CacheClient.CacheConnection(CS); C.Open(); var Command = C.CreateCommand(); // 替换为获取用户可用命名空间的查询 Command.CommandText = "SELECT * FROM %SYS.Namespace_UserList()"; var Values = Command.ExecuteReader(); while (Values.Read()) { // 读取命名空间名称 string namespaceName = Values.GetString(Values.GetOrdinal("Name")); Console.WriteLine(namespaceName); } // 释放资源 Values.Close(); C.Close(); } } }
额外说明
- 若需要更精细的权限筛选,也可直接查询
%SYS.Namespace表并结合用户权限配置过滤,但%SYS.Namespace_UserList()已封装好逻辑,使用更简洁。 - 操作完成后务必关闭数据库连接和DataReader,避免资源泄漏。
内容的提问来源于stack exchange,提问作者Tony Valenti
相关产品推荐
相关产品推荐

