1

Sharepoint 2003 で動作し、特定のユーザー ID によって作成/操作されたすべてのドキュメントを表示するクエリを探しています。

ドキュメントを含むテーブル (Docs) とユーザーのテーブル (UserInfo、UserData) を見つけましたが、両者の関係は少し奇妙に思えます - userdata テーブルには 99,000 レコード、userinfo には 12,000 レコードがあり、400 人のユーザーがいます!

400 のレコードを持つユーザー テーブルとそれをドキュメント テーブルに結合する単純な 1 対多の関係を期待していたと思いますが、そうではないようです。

どんな助けでも大歓迎です。

編集: 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 のリストが取得されます。これらをファイル名/パスまで追跡できるかどうかを確認する必要があります。すべて: 追加のヘルプは大歓迎です!

4

4 に答える 4

1

SharePoint 2003 のデータベースを見たことはありませんが、2007 では UserInfo がサイトに接続されています。つまり、すべてのユーザーが各サイト コレクション (または同等の 2003 概念) の UserInfo に行を持っています。したがって、ユーザーが何をしているかを識別するには、サイト 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 データベースに直接アクセスすることはお勧めしませんが、頭を使って注意してください。更新はすべて大文字の no-no ですが、selects はコンテキストに依存します。

于 2008-11-12T08:13:29.600 に答える
1

SharePoint データベースに直接クエリを実行しないでください。

私はそれを十分に明確にしたのだろうか?:)

C# で使用できるオブジェクト モデルを確認する必要があります。SiteCollection の SPSite インスタンスを取得してから、SPSite および SPWeb オブジェクトに属する SPList インスタンスを反復処理する必要があります。

SPList オブジェクトを取得したら、必要なユーザーをフィルター処理するクエリを使用して GetListItems を呼び出す必要があります。

それはあなたが望むことをするためのサポートされている方法です。

SharePoint はデータベースに直接アクセスするように設計されておらず、データベースの構造がバージョンとアップグレードの間で同じであるという保証 (実際には特定の警告があります) がないため、データベースに直接アクセスしないでください。ファーム内の複数のコンテンツ データベースに分散されているため、あるコンテンツ データベースで実行されるクエリが別のコンテンツ データベースで期待どおりに実行されるという保証はありません。

反復用のオブジェクト モデルを見ると、作成する SPSite および SPWeb オブジェクトを dispose() する必要があることにも注意してください。

ああ、はい、400 人のユーザーがいるかもしれませんが、30 のサイトを持っているに違いありません。情報は、サイトごとにデータベース内で繰り返されます... 30 x 400 = データベース内の 12,000 エントリ。

于 2008-11-22T15:50:31.587 に答える
1

Sharepoint でそのクエリを使用する場合は、コンテンツ データベースでビューを作成したり、データベースに対して直接クエリを実行したりすることは、大したことではないように思われることを知っておく必要があります。回避策として、オブジェクト モデルを反復処理し、結果を独自のデータベースに書き込むカスタム コードを使用することができます。これは、タイマーベースまたはイベントトリガーベースのいずれかです。

于 2008-11-22T15:36:52.410 に答える
0

ロックを使用して SELECT を実行するべきではありません。つまり、クエリに WITH (NOLOCK) を追加します。システムの一部はタイムアウトに非常に敏感であり、システムが予期していなかったロックを導入し始めると、システムが狂ってしまうのを見ることができます。

しかし実際には、オブジェクト モデルを介してこれを行う必要があります。IronPython のようなものをいじってみると、OM を使った実験は実に楽しいものです。

于 2009-07-22T17:49:01.737 に答える