• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

Перенос Документов Из Одной Бд В Другую

dimat

Well-known member
31.07.2008
508
0
BIT
0
Всем привет!

Есть несколько БД с одинаковой структурой (дизайн обновляется из одного шаблона), задача в следущем:
Необходимо реализовать функционал переноса группы документов из одной бд в другую.
Под группой документов понимается наличие главного документа и несколько зависимых, логически связанных определенным значением в полях(то есть не документы-ответы).

Для себя вижу 2 варианта:
1. Скопировать документы из бд источника в бд назначения методом NotesDocument.CopyToDatabase и удалить их в бд источнике;
2. Создать документы по соответствущей форме в бд назначения, скопировать Items (NotesDocument.CopyAllItems) и удалить документы в бд источнике.

Вопрос: как корректнее реализовать?
 

ToxaRat

Чёрный маг
Green Team
06.11.2007
3 332
42
BIT
0
коректнее будет так как вам удобнее и так чтобы работало
чтобы работало скорее всего придется переносить документы и перепривязывать по всем вашим полям, при копировании UNID Документа меняется, хотя его и можно присвоить насильно как у оригинала
 
V

vitte

Была похожая задача. Вот функция для копирования документа в бд-назначение. Может чем поможет.

<!--shcode--><pre><code class='"<pre><code class="sql'>SELECT AnyThing FROM SomeThing[/CODE]">Function CopyWithSameUNID(noteToCopy As NotesDocument, DbDest As NotesDatabase)
Dim noteDest As NotesDocument
Dim doc As NotesDocument
Dim numUID As Variant

On Error Goto FailLabel

'Удаляем из базы такой документ
numUID = noteToCopy.UniversalID
Set doc = DBDest.GetDocumentByUNID(numUID )

If Not doc Is Nothing Then
doc.Remove(True)
End If

Set noteDest = DBDest.CreateDocument
noteDest.UniversalID = noteToCopy.UniversalID

Call noteToCopy.CopyAllItems(noteDest)
Call noteDest.Save(True,True)
FailLabel:
Resume Next
End Function</code></pre>

Добавлено: Была похожая задача. Вот функция для копирования документа в бд-назначение. Может чем поможет.

Function CopyWithSameUNID(noteToCopy As NotesDocument, DbDest As NotesDatabase)
Dim noteDest As NotesDocument
Dim doc As NotesDocument
Dim numUID As Variant

On Error Goto FailLabel

'Удаляем из базы такой документ
numUID = noteToCopy.UniversalID
Set doc = DBDest.GetDocumentByUNID(numUID )

If Not doc Is Nothing Then
doc.Remove(True)
End If

Set noteDest = DBDest.CreateDocument
noteDest.UniversalID = noteToCopy.UniversalID

Call noteToCopy.CopyAllItems(noteDest)
Call noteDest.Save(True,True)
FailLabel:
Resume Next
End Function
 

savl

Lotus Team
28.10.2011
2 597
310
BIT
177
'Удаляем из базы такой документ
numUID = noteToCopy.UniversalID
Set doc = DBDest.GetDocumentByUNID(numUID )

If Not doc Is Nothing Then
doc.Remove(True)
End If

Я бы не удалял, а копировал бы в него все значения. таким образом экономия времени и действий.

If Not doc Is Nothing Then
call noteToCopy.CopyAllItems(doc)
End If

И тогда не надо делать:

Set noteDest = DBDest.CreateDocument
noteDest.UniversalID = noteToCopy.UniversalID

Вообще лучше так, на мой взгляд:

numUID = noteToCopy.UniversalID
Set noteDest= DBDest.GetDocumentByUNID(numUID )

If noteDest Is Nothing Then
Set noteDest= DBDest.CreateDocument
noteDest.UniversalID = noteToCopy.UniversalID
End If

Call noteToCopy.CopyAllItems(noteDest)
' Дополнительное изменение полей.
Call noteDest.Save(True,True)

и еще, я бы не сразу удалял документ источник. Скажем метить к удалению, какое-нибудь служебное поле (deleted = "1"). это позволит при неудавшемся переносе или некорректном найти источник и повторить действие. А удалять все помеченные документы агентом.
 
N

nvyush

Set noteDest= DBDest.GetDocumentByUNID(numUID )
Если в БД DBDest нет документа с UNID numUID, код вывалится с ошибкой. Нужно свою функцию-обёртку получения дока из БД по UNID писать, чтобы это работало. На форуме были примеры, поищите.
 

savl

Lotus Team
28.10.2011
2 597
310
BIT
177
Если в БД DBDest нет документа с UNID numUID, код вывалится с ошибкой. Нужно свою функцию-обёртку получения дока из БД по UNID писать, чтобы это работало. На форуме были примеры, поищите.

использую вот такой маневр, забыл добавить :angry2:

On error resume next
Set noteDest= DBDest.GetDocumentByUNID(numUID )
on error goto FailLable
 
K

Kee_Keekkenen

использую вот такой маневр, забыл добавить :)

On error resume next
Set noteDest= DBDest.GetDocumentByUNID(numUID )
on error goto FailLable

конечно, все зависит от реалий..
я так делал перенос/архивация/синхронизация

если переносимый документ есть в DBDest, то удаляем поля и переносим поля из исходного,
если документа нет, то создаем новый и переносим поля, при необходимости переписываем юниверсалИД от исходного документа, сохраняем док.. исходный помечаем на удаление..
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!