如何查询Microsoft SQL Server指定数据库中所有表的所有者名称或ID
SQL Server查询指定数据库所有表所有者信息方法
以下操作仅需在MSSMS中执行对应查询语句即可实现,无需额外服务器级监控工具:
核心查询逻辑
SQL Server 中表的所有者默认继承所属架构的所有者,你之前查询sys.tables未直接返回所有者名称,是因为需要关联sys.schemas(架构系统视图)和sys.database_principals(数据库主体系统视图)拼接可读的所有者信息。
常用查询语句
1. 查询所有表的所有者(继承架构所有者场景)
USE WAREHOUSE_DATA GO SELECT t.name AS 表名, s.name AS 所属架构名, dp.name AS 所有者名称, dp.principal_id AS 所有者ID FROM sys.tables t INNER JOIN sys.schemas s ON t.schema_id = s.schema_id INNER JOIN sys.database_principals dp ON s.principal_id = dp.principal_id ORDER BY t.name ASC
2. 兼容单独指定表所有者场景的全量查询
如果存在表单独指定了所有者、未继承架构所有者的情况,使用以下语句可以覆盖所有场景:
USE WAREHOUSE_DATA GO SELECT t.name AS 表名, s.name AS 所属架构名, CASE WHEN t.principal_id IS NOT NULL THEN dp_individual.name ELSE dp_schema.name END AS 实际所有者名称, CASE WHEN t.principal_id IS NOT NULL THEN '表单独指定' ELSE '继承架构' END AS 所有者来源 FROM sys.tables t INNER JOIN sys.schemas s ON t.schema_id = s.schema_id INNER JOIN sys.database_principals dp_schema ON s.principal_id = dp_schema.principal_id LEFT JOIN sys.database_principals dp_individual ON t.principal_id = dp_individual.principal_id ORDER BY t.name ASC
注意事项
- 执行查询的账号需要对
WAREHOUSE_DATA数据库持有VIEW DEFINITION权限,否则可能无法返回完整的元数据结果 - 若查询结果中所有者显示为
dbo属于正常情况,dbo是SQL Server数据库的默认所有者主体
内容的提问来源于stack exchange,提问作者fym
相关产品推荐
相关产品推荐

