пятница, 30 октября 2015 г.

Как удалить из базы приватные представления, хранящиеся на сервере

Хранение на сервере SPOFU-представлений (общие представления, которые становятся личными при первом использовании) для каждого пользователя влечет за собой в большинстве случаев неоправданное увеличение объема базы. Сервер плохо перестраивает индексы таких представлений. Как удалить представления пользователей, которые (представления) стали не нужны?
Решение от Дмитрия Ковалева
Если private виды уже существуют, то код, удаляющий виды, следует разместить в обработке события закрытия базы пользователем.
Пример:
Sub Deleteprivateviews 
Dim s As New NotesSession
Dim excerptdb As NotesDatabase
Dim doc As NotesDocument
Dim db As NotesDatabase
Dim view As NotesView
Set db = s.CurrentDatabase
nameslist = ... ' массив из частных представлений и папок, которые надо удалить
If Cstr(nameslist (0)) = "" Then Exit Sub

Forall v In db.Views
Set doc = db.GetDocumentByUnid (v.UniversalID)
Forall n In nameslist
If v.Name=Cstr(n) And Not(v.IsDefaultView) Then
If doc.GetItemValue ("$Readers") (0) <>"" And doc.GetItemValue ("$Readers") (0) <>s.UserName Then v.Remove
End If
End Forall
End Forall
End Sub


Если private виды еще не существуют, то в поле $Readers в этом представлении при создании ее надо вставить вторым значением имя сервера в каноническом формате (после имени пользователя), и тогда вышеприведенный код спокойно можно запускать серверным агентом на сервере. Удалить все private виды вообще
Дополнение от Ильи Клецера
Нет необходимости в модификации поля $Readers.
Пример:
Dim db As notesdatabase
Set db=ses.currentdatabase
Forall v In db.views
Dim doc As notesdocument
Set doc = db.GetDocumentByUnid (v.UniversalID)
If v.name = "Folder" And doc.GetItemValue ("$Readers") (0) <>"" Then
Print doc.GetItemValue ("$Readers") (0)
Call v.remove
End If
End Forall

Приведенный код подписывается от имени _сервера_, в логе видны имена всех пользователей, чьи папки созданы, папки благополучно удаляются

Комментариев нет:

Отправить комментарий