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

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

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

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

Удалить дубли документов

dimat

Well-known member
31.07.2008
508
0
BIT
0
Всем привет, накосячил с агентом. Результат: продублировались все документы в базе, как это исправить, тоесть удалить все дубли?
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Легко вычислить по автору и дате создания.
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Я про это и говорю. Поиском или через представление по дате создания легко найти все дубли.
 
A

alik86

Created, Modified, Modified by...
Добавлено: GetModifiedDocuments method, @Created, @Modified и др.
 

dimat

Well-known member
31.07.2008
508
0
BIT
0
Сделал вью по всем документам с категоризированой колонкой @text(@Created)+" - "+@DocChildren.
Получилось на некоторые даты-время по несколько десятов документов причем разных форм.
 

Medevic

Что это ? :)
Green Team
10.12.2004
3 334
1
BIT
4
Даты могут отличаться на секунды/минуты.
Надо брать документы за период.
SELECT (@Created > [Дата - 5мин]) & (@Created < [Дата + 5мин])
 
A

alik86

Получилось на некоторые даты-время по несколько десятов документов причем разных форм
Ну так может по несколько десятов документов и было создано. А нужную форму укажите в формуле отбора вида.
 

dimat

Well-known member
31.07.2008
508
0
BIT
0
11212.png
Код:
Set dc=dbd.AllDocuments
Call dbd.CreateCopy("",DirPath(0)+dbd.FileName)
Set doc=dc.GetFirstDocument		
While Not doc Is Nothing
Call doc.CopyToDatabase(dbd)
Set doc=dc.GetNextDocument(doc)
Wend
Для каждого документа по 1 копии
 

dimat

Well-known member
31.07.2008
508
0
BIT
0
Может как то в цикле все документы сравнивать?
Цикл по всем дкументам текущий сравниваем со следущими, если находится идентичный то удаляем его.
ТОлько вот как сравнивать?

UPD: По размеру?

Код:
Set dc=db.AllDocuments

Set docc=dc.GetFirstDocument
While Not docc Is Nothing
Set docs=dc.GetNextDocument(docc)		
While Not docs Is Nothing
If docc.Size=docs.Size Then
set tmpdoc=dc.GetPreDocument(docs)
Call docs.remove(true)
set docs=tmpdoc
End If
Set docs=dc.GetNextDocument(docs)
Wend
Set docc=dc.GetNextDocument(docc)
Wend

Получится так сделать?
 
A

alik86

Что-то я так и не понял, чем не покатил поиск по created, modified?
В принципе у документов-копий created и modified должны совпадать до секунды - можно поплясать от этого.
 

dimat

Well-known member
31.07.2008
508
0
BIT
0
Что-то я так и не понял, чем не покатил поиск по created, modified?
В принципе у документов-копий created и modified должны совпадать до секунды - можно поплясать от этого.
Тоесть искать дубли точно также как я написал выше по размеру, только по дате создания и изменения?
 
A

alik86

Создайте вид с формулой отбора SELECT ((Form = "Forma") & (@Created = @Modified)), он выдаст вам документы по нужной форме, которые были скопированы программно.
В общем случае при создании документа "ручками" created - это момент создания, а modified - момент сохранения, т.е. "modified - created = время заполнения полей документа". При программном копировании для документа эти моменты совпадают. Как-то так.
P.S. Только не забывайте про "7 раз отмерь - один раз отрежь" - перепроверьте, ибо я выдал лишь своё предположение. :ya_lamo:
 

dimat

Well-known member
31.07.2008
508
0
BIT
0
Создайте вид с формулой отбора SELECT ((Form = "Forma") & (@Created = @Modified)), он выдаст вам документы по нужной форме, которые были скопированы программно.
В общем случае при создании документа "ручками" created - это момент создания, а modified - момент сохранения, т.е. "modified - created = время заполнения полей документа". При программном копировании для документа эти моменты совпадают. Как-то так.
P.S. Только не забывайте про "7 раз отмерь - один раз отрежь" - перепроверьте, ибо я выдал лишь своё предположение.
Проверил, не то, всего в бд было около 30000 документов, сейчас около 60000. тоесть ровно в 2 раза больше.
Сделал представление по указанной выше формуле, по этой форме было примерно 1300 доков сейчас по ней 2600, отображается только 20, какие еще есть варианты?


Юзеры скоро загрызут.... :ya_lamo:
 
D

Darker

Отсортируй представление по общему параметру, и удаляй каждый первый(второй) документ
 
D

Darker

Код:
lead=true
set doc=view.getfirstdocument
while not doc is nothing
lead=not lead
if lead then doc.ToRemove="1":call doc.save(true,False)
set doc=view.getnextdocument(doc)
wend

set col=db.Search({ToRemove="1"},Nothing,0)
col.RemoveAll(1)
 
A

alik86

Зато наверняка усвоите, что НЕЛЬЗЯ экспериментировать на рабочей базе!
Высказывание: Последовательность "эксперимент -> *цензура*..ц -> чтение документации" даже из толковых админов/программеров тяжело выбить.
 

dimat

Well-known member
31.07.2008
508
0
BIT
0
Зато наверняка усвоите, что НЕЛЬЗЯ экспериментировать на рабочей базе!
Высказывание: Последовательность "эксперимент -> *цензура*..ц -> чтение документации" даже из толковых админов/программеров тяжело выбить
Полностью согласен, что тяжело выбить:), сколько раз уже зарекался не экспериментировать на раб базе
 
Мы в соцсетях:

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