AÇIKLAMA:


SQL veritabanında wFormData tablosundan silinen kayıtları BaseX veritabanından geri getirmek için kullanılır.


ÇÖZÜM:


Aşağıdaki işlemler yapılmadan önce sırasıyla;

-Agent ve BaseX servisleri durdurulur.

-Sorguların çalışacağı tüm BaseX veritabanlarının ve SQL veritabanındaki wFormData tablosunun yedeği alınır.

-Kullanılacak BaseX veritabanları optimize edilir.


Formu olmayan süreçleri ve FormDataId'lerini listeler.

Select
ver.processId as procId, 
LOWER(wi.DataId) as formdataId
from wWorkItems wi with(nolock) 
inner join wInstances ins with(nolock) on ins.Id = wi.InstanceId
inner join wVersions ver with(nolock) on ver.Id = ins.ProcessVersionId
inner join wProcesses pro with(nolock) on pro.Id = ver.ProcessId 
where pro.Id IN('E74EC472-BB8B-438B-897B-2F98F4C44300') and 
DataId not IN (select Id from wFormdata with(nolock) where CollectionId = 'E74EC472-BB8B-438B-897B-2F98F4C44300') 
group by ver.processId, wi.DataId
order by ver.processId ASC

Not: Sorgunun bu halinde pro.Id ve CollectionId adında iki kriter vardır, daha hızlı çalışması için eklendi. Ancak bunlar kaldırılarak tüm süreçlerdeki benzer formlarda sorgulanabilir.



BaseX arayüzünde çalıştırılmak üzere XQuery sorgularını verir.

Select CONCAT('concat("Insert Into [ALTIKARE].[dbo].[wFormData] Values(''", 
''',wi.DataId,''',
"'', ''", 
replace(serialize(form[@Id="', LOWER(wi.DataId),'"]), "''", "''''"), 
"'', ''repo1'', ",
"''', ver.processId,''');"),') as XQuery, 
ver.processId as procId, 
LOWER(wi.DataId) as formdataId, 
wi.DataId as formUPPER
from wWorkItems wi with(nolock) 
inner join wInstances ins with(nolock) on ins.Id = wi.InstanceId
inner join wVersions ver with(nolock) on ver.Id = ins.ProcessVersionId
inner join wProcesses pro with(nolock) on pro.Id = ver.ProcessId 
where DataId not IN 
(select Id from wFormdata with(nolock)) 
group by ver.processId, wi.DataId
order by wi.DataId ASC


Elde edilen sorgular BaseX'de çalıştırıldığında form verilerini içeren SQL INSERT sorguları oluşturulmuş olur. 

Bu SQL INSERT sorguları da SQL Server Management Studio üzerinde çalıştırılarak kayıtlar eklenir. (Toplu halde çalıştırılabilir)



EK BILGILER:


        #1

                BaseX'de elde edilen sorgular, form verisi bulunmayan akışlar için de Graph kolunu boş olan bir insert sorgusu                 döner. Bu durumun faydası yada zararı yoktur. 

                Ancak yine de herhangi bir sebeple silinmesi istenirse, ikinci adımda yer verdiğim sorgu ile işbu kayıtlar                             listelenebilir. 


        #2

Graph kolunu boş olan formları listeler.

Select count(*) from wFormdata with(nolock) where Graph.exist('*') = 0

Not: Bu sorgu uzun sürebilir. Ancak sürece göre filtrelemek ve sorgunun daha hızlı çalışmasını sağlamak için collectionId kriteri eklenip kullanılabilir.


        #3

BaseX veritabanlarını optimize etmek için kullanılır.

db:optimize(
 'mydb',
 true(),
 map { 'updindex':true(), 'textindex': true(), 'textinclude':'id' }
)

Not:  BaseX arayüzünde çalıştırılır ve başlatıldığında işlem bitene kadar durdurulmaması tavsiye edilir.

Kaynak : http://docs.basex.org/wiki/Indexes