イルミネーション [こーひーぶれいく]
あと1ヶ月ほどでクリスマスですね。クリスマスと言えばイルミネーション。近くの住宅街では毎年競うように電飾を飾っていてとてもきれいです。
去年の我が家は地味に庭の木に電飾を1つだけ飾りました。それでも子供は大喜びでしたが。
今年はもう少し電飾を増やそうと本日お店に見に行きました。
そこで新作の機関車3Dイルミネーションを発見!機関車のイルミネーションは去年もあったのですが電球だったので消費電力が500Wもあり、ちょっと手がでない代物でした。
今年のはLEDで消費電力が少なく、しかもメッシュや磨り硝子風のアクリル板で面が構成されていてとてもきれいです。店員さんに聞いたところ、3Dイルミネーションは電化製品の分類ではなく、玩具に当たるため、メーカー保証は無し。値段も高いのでさんざん悩みましたが、結局機関車の3Dイルミネーションを買ってしまいました。
明日は設置を行います。設置できたら写真でも掲載しますね。
新 サブサイト→トップレベルサイト -(3)- ユーザーとクロスサイトグループのコピー [技術情報]
今回はユーザーとクロスサイトグループに関してです。
ユーザーとクロスサイトグループはロールと密接につながっているようです。
ユーザーを追加する際は下記の命令で実装できます。
NewRole.AddUser(ログイン名 as string 、メールアドレス as string 、
ユーザー名 as string 、備考 as string )
クロスサイトグループを追加する際は下記の命令で実装できます。
NewRole.AddGroup(グループ as SPGroup)
そこで下記のように実装してみました。前回作成したNewRoleに対してユーザーとクロスサイトグループを追加しています。
'--- Target Role Users
For Each TargetUser In TargetRole.Users
'--- Flag Initialed
Flg = False
'--- New Role Users
For Each NewUser In NewRole.Users
'--- Target Role Check
If TargetUser.LoginName = NewUser.LoginName Then
Flg = True
Exit For
End If
Next
'--- Flag Check
If Flg = False Then
'--- Role Add
NewRole.AddUser(TargetUser.LoginName, TargetUser.Email, TargetUser.Name, TargetUser.Notes)
End If
For Each TargetGroup In TargetRole.Groups
'--- Flag Initialed
Flg = False
'--- New Role Groups
For Each NewGroup In NewRole.Groups
'--- Target Role Check
If TargetGroup.Name = NewGroup.Name Then
Flg = True
Exit For
End If
Next
'--- Flag Check
If Flg = False Then
'--- Role Add
NewRole.AddGroup(TargetGroup)
End If
うーん、美しくないですねぇ。誰かもっと美しい方法があれば教えてください。
とりあえずはこれでユーザーとクロスサイトグループをコピーすることができました。
次回はやっかいなリストに入ります
新 サブサイト→トップレベルサイト -(2)- サブサイト作成とロールのコピー [技術情報]
前回までのプログラムで新しいコンテンツDBの作成と新しいサイトコレクション+トップレベルサイトまで作成できました。
今回から複数回に分けてサブサイトをコピーしようと思います。
仕様としてサブサイトは階層構造で作成されていますので、コピーする部分は再帰的に呼ばれてもいいように考慮する必要性があります。私の場合はFunctionを使用して再帰的に呼ばれるようにしました。
前提(パラメータ)
RootWeb … コピー先ルートサイト
TargetWeb … コピー元サブサイト
戻り値
コピー後サブサイト
Public Function CopyNewWeb(ByVal RootWeb As SPWeb, _
ByVal TargetWeb As SPWeb) As SPWeb
まず、コピー先ルートサイト配下に新規のサイトを作成します。
Dim strWebUrl As String '-- コピー先サイトURL
strWebUrl = TargetWeb.Url.Split("/")(TargetWeb.Url.Split("/").Length - 1)
CopyNewWeb = RootWeb.Webs.Add( _
strWebUrl, TargetWeb.Title, TargetWeb.Description, _
TargetWeb.Language, TargetWeb.WebTemplate, _
TargetWeb.HasUniquePerm, False)
次にRoleをコピーします。が、そこで注意です。SharePointの標準的なロールには管理者、Webデザイナ、投稿者、閲覧者、ゲストが存在します。しかし、ゲストはサイト自体に権限がない状態でリストやドキュメントライブラリに権限を付与した際に使用されるロールでこのロールは作成することができないようです。そこでゲストロールは省きます。ゲストロールかの判断はSPRoleType.Guestの値を使用します。
Dim TargetRole as SPRole
For Each TargetRole In TargetWeb.Roles
'--- Guestは対象外
If TargetRole.Type <> SPRoleType.Guest Then
'--- 当該ロールが存在した場合にTrueにする
Flg = False
'--- コピー先サイトのロール
For Each NewRole In NewWeb.Roles
'--- Guestは対象外
If NewRole.Type <> SPRoleType.Guest Then
'--- ロールの比較
If TargetRole.Name = NewRole.Name Then
Flg = True
Exit For
End If
End If
Next
'--- 該当ロールが存在しなかった場合は追加する
If Flg = False Then
'--- ロールの追加
NewWeb.Roles.Add(TargetRole.Name,
_ TargetRole.Description, TargetRole.PermissionMask)
End If
End If
Next
次回はユーザーとクロスサイトグループの追加をしようと思います。
新 サブサイト→トップレベルサイト - (1) - [技術情報]
ご無沙汰してます。
しばらく更新してませんでしたがまた徐々に更新をしていきたいと思います。
まずはおわびから。一番最初に書いた記事について間違いがありました。(http://blog.so-net.ne.jp/SharePoint_Programing/2007-05-15) この方法ではワークスペースが移行できなかったり、エラーになる場合があり、実際の現場では使えませんでした。不完全な記事を掲載してしまい申し訳ありません。
そこで、できるかはわかりませんがサブサイト→トップレベルサイトの移行ツールを作成してみようと思います。(懲りもせず自分で試行錯誤の末、完成させようと考えています。間違っている可能性も多々あるとは思いますがご容赦ください) m(_ _)m
まずは要件として大きすぎるコンテンツDBのサブサイトを別のコンテンツDBに移行するというものを考えます。実現方法は自分が得意とするWindowsAPPで実現しようと思います。WSSではトップレベルサイトはSPSite、サブサイトはSPWebのオブジェクトになるため、移行先にはダミーでトップレベルサイトを作成し、サブサイト同士でオブジェクトをコピーしようと思います。
まずはコンテンツDBの作成です。
Dim MySPGlobalAdmin as New SPGlobalAdmin
Dim MySPVirtualServer As SPVirtualServer _
= MySPGlobalAdmin.OpenVirtualServer(VirtualServerUri)
Dim strDatabaseServer as string _
= MySPVirtualServer.ContentsDB(0).Server
Dim MySPLanguage as SPLanguage = MySPGlobalAdmin.ServerLanguage
Dim strDatabaseName as string = "NewConDB"
Dim strUserName as string = nothing
Dim strPassword as string = nothing
Dim nWarningSiteCount as integer = 1
Dim nMaximumSiteCount as integer = 1
Dim nStatus = 0
Dim strSiteUrl as string = "Site Url"
Dim strTitle as string ="テスト"
Dim strDescription as string = "サイトコレクション作成のテスト"
Dim nLCID as System.Uint32 = Convert.ToUInt32(MySPLanguage.LCID)
Dim strWebTemplate as string = "STS#0"
Dim strOwnerLogin as string = "オーナーログイン名"
Dim strOwnerName as string = "オーナー名"
Dim strOwnerEmail as string = "オーナーメールアドレス"
'--- コンテンツDB作成
MySPVirtualServer.ContentDatabases.Add( _
strDatabaseServer, strDatabaseName, strUsername, _
strPassword, nWarningSiteCount, nMaximumSiteCount, nStatus)
'--- サイトコレクション作成
Dim NewSite As SPSite = MySPVirtualServer.Sites.Add( strSiteUrl, strTitle, _
strDescription, nLCID, strWebTemplate, strOwnerLogin, strOwnerName, _
strOwnerEmail)
次回はサブサイトのコピーを考えます。
ユーザー情報の抽出-SQL- [技術情報]
今回はユーザー情報の取得について書きます。
SharePointに於いてユーザーに関するテーブルは下記のテーブルです。
・UserInfoテーブル … 過去にサイトコレクションにアクセスしたユーザー
代表的なカラム:tp_siteID,tp_ID,tp_login,tp_title,tp_email
・WebGroups … サイトコレクションに登録されている権限グループ
代表的なカラム:SiteID,WebID,ID,Title
・WebMembersテーブル … サブサイト毎のユーザー一覧
全カラム:WebID,UserID,STSToken
・WebGroupMembershipテーブル … サブサイトとユーザーと権限グループを紐つける
全カラム:WebID,GroupID,MemberID
UserInfoテーブルはSiteIDしか情報を持っていないため、他のテーブルと関連づけて抽出しないとサブサイト(WebID)毎には抽出できないようになっています。
上記のテーブルを組み合わせることによりいろいろな情報を取得することが可能です。
下記に私が運用で使用しているSQLを2つほど例として記載しておきます。
サイトユーザーの取得SQL
SELECT DISTINCT u.tp_Login FROM dbo.UserInfo as u
LEFT JOIN WebMembers as wm on u.tp_id = wm.UserID
INNER JOIN WebGroupMemberShip as wgms on wgms.MemberID = u.tp_id
INNER JOIN WebGroups as wg on wgms.WebID = wg.WebID
and wgms.GroupID = wg.ID
WHERE u.tp_Deleted = 0
アクセス権の取得SQL
SELECT w.FullUrl,u.tp_Login,wg.Title from UserInfo as u
LEFT JOIN WebMembers as wm on u.tp_id = wm.UserID
LEFT JOIN Webs as w on u.tp_SiteID = w.SiteID
LEFT JOIN WebGroupMemberShip as wgms on w.ID = wgms.WebID
and u.tp_id = wgms.MemberID
LEFT join WebGroups as wg on wgms.WebID = wg.WebID
and wgms.GroupID = wg.ID
WHERE wgms.MemberID is not NULL
GROUP BY w.FullUrl,u.tp_Login,wg.Title
ORDER BY FullUrl
ホタル鑑賞会 [こーひーぶれいく]
いやー、たいぶさぼってしまいました。
今日から気持ちをリセットして再開します。実は先週の土曜日にホタル鑑賞会に行ってきました。前日に雨が降り、当日は風もあまりなかったためホタル鑑賞には条件がよかったです。
自治会の方と地元高校の先生が新しく住人になった人にもホタルが生息していることを知ってもらいたいと案内してくれました。場所は、自宅から歩いて10分ほどの水田です(ホタルがいるなんて気がつきませんでした)
みられたのはヘイケボタルでしたが、もう少し奥に行くともっと大きいゲンジボタルもみられるとのことです。(ただし、長靴に長袖長ズボンの完全装備でないといけない場所とのことですが)
このあたりは宅地開発の折にほたるの生存環境保護のため水源確保をしたり、学生がホタルの幼虫のえさになるカワニナを放流したりして、ホタルの生息環境を守る努力をしているそうです。また、葉に止まって光っているのはメスで、飛ぶのはオス。オスは飛びながらペアになるメスを探すそうです。
鑑賞会は夜8時頃から始めました。その頃には稲の葉に止まっているホタルが多数いましたが、あまり飛んではいませんでした。しかし、夜8時半頃になると一斉にホタルが飛び始め、人の服に止まったりしだしたので、子供たちが大喜びしていました。あたり一面とまでは行きませんでしたが目の前を光を放ちながら何匹ものホタルが横切るのはなかなか幻想的でもあり癒されるひとときでした。
家に近くにホタルが生息する環境が残っているとはびっくりしましたが、これから育っていく子供のためには最高の環境だと思いました。いつまでもホタルがみれる土地であるように私も自然環境保護にできるだけ協力していきたいと思います。
「サイトとワークスペースの管理」が開けない [技術情報]
「サイトとワークスペースの管理」が表示できなくなった事象の対処法について記載する。
SPS2003でページの表示エラーやサイトの削除エラーが発生する場合は、よくデータベース上に迷子データが残ってしまっている場合が多い。
先日、ユーザー環境にて「サイトとワークスペースの管理」ページを開く際にエラーが発生するとの連絡があり対処を実施した。まず最初に、直前の操作を確認したところ、サブサイトを「サイトの削除」で削除したとのこと。
そこでWebsテーブルのfullurlを削除したサイトURLでLike検索したところ、やはり消したはずのデータが残ってしまっていた。残っていたデータのWebIDをキーに全テーブルを調査し、2つのテーブルに残存していたデータをDELETEしたら無事に「サイトとワークスペースの管理」画面が表示できるようになった。
ここからは想像だが、サイトの削除を実行した際、本来ならデータベースの各テーブルに存在する該当サイトに紐つくデータを削除するが、何らかの原因により途中で止まってしまうことがあるのではないか?Websに消したはずのデータが残ってしまっているため「サイトとワークスペースの管理」を表示する際にWebsに登録されているサイト情報を見に行ってデータが中途半端になっているためエラーになるのではないかと思われる。
SharePointの運用をやっていて思うのだがもう少しエラーログを充実させてほしい。ユーザーからはSharePointでエラーが発生したと画面キャプチャーを送ってきたりするが、ほとんどのエラー画面が同じエラーメッセージのためエラーの判別と対応が非常に難しい。
MOSS2007でも状況は変わらないんだろうなぁ。
WSS3.0 コンテンツDB -(2)- AllDocVersions [技術情報]
今回はドキュメントのバージョン管理で使用するDocVersionsテーブルの差異について調べます。
【DocVersionsとAllDocVersions】
× → CheckinComment
× → Level
× → DraftOwnerId
× → DeleteTransactionId
上記の4カラムが追加になっているようです。
主キー項目(Siteid,Id,Version)はWSS2.0と同じなのでテーブル名は変わっていますが
格納されるデータは変わらないのではないかと推測されます。
WSS3.0 コンテンツDB -(1)- 環境構築~AllDocs構造 [技術情報]
やっとWSS3.0のテスト環境が構築できました。
ReadMeも見ずにテスト的に作ったからちょっと不安だけど、とりあえずサイトの作成ができたから大丈夫そう。でもまだメールとかは設定は完了してないけど。。。まぁ、この辺はkunitakaさんのページとかを参考にあとで修正しましょう。
まず、第一感想。重いっ!!確実にSPS2003より重くなってる。会社のMOSS2007への移行プロジェクトが心配になってきた。無事移行できてもユーザーが納得するかなぁ?
見た目はかなりよくなってるね。しかし、ちょっとした画面の遷移でも時間がかかるのは見た目を強化したせいだろうか?
実は会社ではSQLServer2000のストアドを駆使していろいろな統計情報を取得したり更新処理を保管したりしています。今回WSS3.0ではゴミ箱機能が装備されたこともありかなりのストアドを修正する必要性があるのではないかと考えています。
SPS2003のデータベース構造は以前書いたことがありますがWSS3.0はどうなっているのでしょうか?早速、気になっていたデータベースの中身を確認してみた。
【主なテーブル】
ComMd → ComMd
Docs → AllDocs ?
DocVersions → AllDocVersions ?
Lists → AllLists ?
Personalization → Personalization
SiteGroups → Groups ?
Sites → Sites
UserData → AllUserData ?
UserInfo → UserInfo
WebGroupMemberShip → GroupMemberShip ?
WebGroups → Groups ?
WebMembers → WebMembers
WebParts → Webparts
Webs → Webs
ゲゲッ!?テーブルの数が多い。。。しかもテーブルの名前自体が変わってる。ストアドは全滅かも。
つぎにDocsのカラムについて確認する。
【DocsとAllDocsの差異】
Docsから削除されたカラム
CheckoutSize → ×
Content → ×
CheckoutContent → ×
AllDocsに追加されたカラム
× → ListDateDirty
× → ProgId
× → DeleteTransactionId (PK) 主キーが追加されているということはゴミ箱対応かな?
× → SetupPathVersion
× → SetupPathUser
× → UnVersionedMetaInfo
× → UnVersionedMetaInfoSize
× → UnVersionedMetaInfoVersion
× → WelcomePageUrl
× → WelcomePageParameters
× → IsCurrentVersion
× → Level
× → CheckinComment
× → AuditFlags
× → InheritAuditFlags
× → DraftOwnerId
× → UIVersionString
× → ParentId
× → HasStream
× → ScopeId
× → BuildDependencySet
× → ParentVersion
× → ParentVersionString
× → TransformerId
× → ParentLeafName
× → IsCheckoutToLocal
× → CtoOffset
× → ExtensionForFile
× → ItemChildCount
× → FolderChildCount
うーん、単純に考えてもデータカラムが増えているということは書き込みにも時間がかかるわけで、重い理由がなんとなくわかった気がする。
ゴミ箱実装失敗 [技術情報]
MOSS2007にはゴミ箱機能が実装されているようですね。
うーん、似たような機能を簡単にSPS2003に実装できないかと考えてチャレンジしました。
対象としてドキュメントライブラリに格納した文書に限定したらSQLServerのTriggerでなんとかならないかと思ってやってみたのですが。。。駄目でした。
ドキュメントはデータベースのDocsテーブル、Listsテーブル、UserDataテーブルに情報が格納されます。だからDELETE Triggerで同一構造のゴミ箱テーブルに待避するトリガーを作成して実行してみたのですが、transact-SQLの制限でImage型を使えないようでエラーになってしまいました。
やっぱりドキュメントライブラリイベントをハンドリングするWebパーツを作らないと駄目みたいですね。
時間があったらチャレンジします。
そのまえにMOSS2007に移行しろって言われそう(汗)