我正在寻找一个可以在Sharepoint 2003上运行的查询,向我展示给定用户ID创建/触摸的所有文档。

我找到了包含用户文档(Docs)和表格的表格(UserInfo,UserData) 但是它们之间的关系看起来有点奇怪 - 我们的userdata表中有99,000条记录,userinfo中有12,000条记录 - 我们有400个用户!

我想我期待一个简单的1对多关系,用户表有400条记录并将其加入到文档表中,但我发现情况并非如此。

任何帮助都将不胜感激。

编辑: 谢谢Bjorn, 我已将该查询转换回Sharepoint 2003结构:

select 
d.* from 
userinfo u join userdata d 
on u.tp_siteid = d.tp_siteid  
and 
u.tp_id = d.tp_author 
where
u.tp_login = 'userid' 
and
d.tp_iscurrent = 1

这给我一个siteid / listid / tp_id的列表我将不得不看看我是否可以追溯到文件名/路径。 全部:任何额外的帮助仍然受到赞赏!

有帮助吗?

解决方案

我从未在SharePoint 2003中查看过数据库,但在2007年,UserInfo已连接到Sites,这意味着每个用户在UserInfo中都有一行用于每个网站集(或等效的2003概念)。因此,要确定用户是什么,您需要站点ID和该站点内的用户ID。在2007年,我会从这样的事情开始:

select d.* from userinfo u 
join alluserdata d on u.tp_siteid = d.tp_siteid 
and u.tp_id = d.tp_author 
where u.tp_login = '[username]'
and d.tp_iscurrentversion = 1

更新:正如其他人在这里写的那样,不建议直接进入SharePoint数据库,但我会说用你的头并小心。更新是全封闭禁止,但选择取决于上下文。

其他提示

请勿直接查询SHAREPOINT DATABASE!

我想知道我是否说得那么清楚了? :)

您真的需要查看C#中可用的对象模型,您需要获取SiteCollection的SPSite实例,然后遍历属于SPSite和SPWeb对象的SPList实例。

获得SPList对象后,您需要使用筛选所需用户的查询来调用GetListItems。

这是做你想做的事情的支持方式。

您永远不应该直接访问数据库,因为SharePoint根本不是为此设计的,并且无法保证(实际上,有一个特定的警告)数据库的结构在版本和升级之间是相同的,并且此外,当内容分布在服务器场中的多个内容数据库时,无法保证在一个内容数据库上运行的查询将在另一个内容数据库上执行您所期望的操作。

当您查看对象模型以进行迭代时,还要注意您将需要dispose()您创建的SPSite和SPWeb对象。

哦,是的,你可能有400个用户,但我敢打赌你有30个网站。信息在每个站点的数据库中重复... 30 x 400 =数据库中的12,000个条目。

如果要在Sharepoint中使用该查询,您应该知道在内容数据库上创建视图或直接针对数据库查询似乎是一个很大的禁忌。解决方法可能是一些自定义代码,它遍历对象模型并将结果写入您自己的数据库。这可以是基于计时器的,也可以基于事件触发器。

你真的不应该用Locks做SELECTs,即在你的查询中添加WITH(NOLOCK)。系统的某些部分对超时很敏感,如果你开始引入系统没有预料到的锁,你就会看到系统发生故障。

但实际上,你应该通过对象模型这样做。像IronPython这样的东西以及对OM的实验几乎是非常愉快的。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top