TFS2015如何查询所有共享及用户自有通知及其所有者?
我来帮你搞定这个问题!针对TFS 2015本地版区分共享和用户自有变更通知的需求,我整理了两种靠谱的方案,不管是直接查数据库还是用REST API都能解决,具体如下:
一、直接查询TFS数据库方案
你提到的tbl_EventSubscription确实是存储订阅的核心表,但区分共享/自有得关联其他表才行。共享通知一般是团队或项目级别的设置创建的,而用户自有通知是个人创建的,关键看订阅者的身份类型——我们可以通过关联tbl_Identity表来判断。
SQL查询示例
SELECT es.SubscriptionId, es.Name AS SubscriptionName, es.Description, -- 通过IsContainer字段判断订阅类型:容器身份代表团队/项目组(共享),普通用户为自有 CASE WHEN i.IsContainer = 1 THEN 'Shared (Team/Project Group)' ELSE 'User-Owned' END AS SubscriptionType, i.DisplayName AS OwnerDisplayName, i.UniqueName AS OwnerUniqueName FROM tbl_EventSubscription es -- 左关联避免因已删除身份导致的记录丢失 LEFT JOIN tbl_Identity i ON es.SubscriberId = i.IdentityId WHERE -- 过滤变更类通知,可根据实际需求调整EventType es.EventType IN ('ms.vss-work.workitem-changed-event', 'ms.vss-code.git-push-event') ORDER BY SubscriptionType, OwnerDisplayName;
关键说明
tbl_Identity.IsContainer:值为1时表示该身份是团队、项目组这类“容器”实体,对应的订阅就是共享通知;值为0则是普通用户,属于个人自有通知。- 建议在非生产环境先测试查询,遵循微软的TFS数据库访问政策,只做查询操作,不要修改数据。
二、使用TFS 2015 REST API方案
如果不想直接碰数据库,用REST API更安全也更适合自动化场景。TFS 2015的API支持查询事件订阅,还能直接返回订阅者的类型。
API端点示例
查询集合下所有订阅
GET http://<你的TFS服务器地址>/DefaultCollection/_apis/eventsubscriptions?api-version=1.0
按项目过滤订阅
GET http://<你的TFS服务器地址>/DefaultCollection/<项目名称>/_apis/eventsubscriptions?api-version=1.0
区分订阅类型的方法
API返回的JSON结果里,subscriber.kind字段会明确标识订阅者类型:
kind: "user":该订阅是用户个人创建的自有通知kind: "group":该订阅属于团队/项目组,是共享通知
返回片段示例:
{ "id": "a1b2c3d4-5678-90ef-ghij-klmnopqrstuv", "name": "My Work Item Change Alert", "subscriber": { "kind": "user", "displayName": "Jane Smith", "uniqueName": "contoso\\jane.smith" }, "eventType": "ms.vss-work.workitem-changed-event" }
注意事项
- 调用API需要身份验证,可使用基本认证(用户名+密码)或个人访问令牌(如果TFS 2015支持的话)。
- 可以用curl、Postman快速测试,也能在C#、PowerShell等代码中集成调用。
额外提示
- 如果数据库查询中出现
SubscriberId找不到对应Identity的情况,大概率是已删除的用户或组,用LEFT JOIN可以保留这些记录并做标记。 - REST API返回的结果包含更多上下文信息(比如订阅的触发条件),如果需要后续处理,API方案更灵活。
内容的提问来源于stack exchange,提问作者W. Siegmund
相关产品推荐
相关产品推荐

