Merestore Sharepoint site dari SQL backup (bak)

Hari ini diminta untuk merestore Sharepoint backup sama klien, the thing is… yang dia berikan adalah file dump backup SQL (yang biasanya ekstensinya .bak)

Secara teori sih bisa dilakukan, tapi prakteknya pasti bermasalah. tapi ya karena client sudah mengirim file ratusan mega itu, terpaksa kita coba dulu 🙂

Well, hal pertama yang dilakukan di SQL Server adalah:

  1. Merestore file backup itu ke SQL-Server
  2. Pastikan security di database yang direstore yang digunakan menggunakan Administrator Windows Authentication (untuk menghindari masalah nantinya)

Hal yang dilakukan di Sharepoint Central Administrator

  1. Buat Web Apllication baru, masukan nilai2 sesuai environment dan jangan ubah database namenya. Tidak usah membuat site collection, jangan ubah nama database contentnya (soalnya nanti kita hapus)

    wss_content

    wss_content

  2. Masuk ke Application Management -> Content Database, dan hapus database WSS_Content yang terattach ke web-application yang tadi dibuat

    content database

    content database

  3. Masuk ke command prompt, jalankan stsadm untuk menambah content database, alasan aku menggunakan stsadm adalah agar aku bisa tahu error apa yang terjadi dalam proses penambahan content databasenya 🙂
    stsadm -o addcontentdb -url http://server:port -databasename namadatabasecontentyangdirestore -databaseserver namaserverdatabase
    
  4. Kalau prosesnya lancar, coba buka sitenya di web-browser, semua selesai 🙂

Dalam proses yang aku lakukan, ternyata terjadi error. Error yang terjadi di environmentku nampak seperti ini:

The specified SPContentDatabase Name=wss_content_internet Parent=SPDatabaseServiceInstance has been upgraded to a newer version of SharePoint. Please upgrade this SharePoint application server before attempting to access this object.

Error yang sudah diduga karena perbedaan versi Sharepoint milik client dan milikku. Hal yang aku lakukan adalah membuka database contentnya secara manual di SQL Management Studio dan merubah version database yang direstore secara paksa agar sesuai sama version database content yang ada.

SELECT [VersionId]
,[Version]
,[Id]
FROM [WSS_Content_Restored].[dbo].[Versions]
<p>SELECT [VersionId]
,[Version]
,[Id]
FROM [WSS_Content_YangAda].[dbo].[Versions]

Different Version

Different Version

Sesuai dugaan, Hasilnya beda versi, jadi aku mengupdate versi database yang direstore agar sama dengan versi database yang ada di lokal dengan menggunakan SQL UPDATE biasa.

Perlu diingat ini adalah hack, jadi begitu site sudah up, lakukan backup-restore yang proper 🙂

Similar Version

Similar Version

Setelah versinya sama, coba jalankan stsadm lagi, dan akses sitenya.

Voila! it works! 🙂

SQL Server ~ Membuat Data Hierarki Dengan Rekursi

Hari ini mendapatkan soal dari prospect-client tentang SQL, intinya ini adalah kasus umum dimana sebuah tabel memiliki informasi hierarki ke dirinya sendiri (Tree).

Tabel dengan Hierarki

Tabel dengan Hierarki

Tabel diatas merupakan tabel Worker dimana disana ditentukan seorang Worker bisa membawahi worker lain, dan worker bawahannya juga bisa memiliki bawahan-bawahan sampai sejumlah n.

Ini bisa berlaku ke struktur menu, struktur lineage keluarga, strktur pangkat dan struktur apapun yang berbentuk n-tree.

Isi datanya

Isi datanya

Contoh data diatas Reed memiliki ManagerId null artinya dia ada diatas puncak Tree, Ted memiliki ManagerId 1, artinya dia anak buah Reed. Dan begitu seterusnya.

Jika kita disuruh untuk mendapatkan hierarki satu atau dua level dari seseorang sih mudah. Dapatkan saja ManagerId mereka dengan sebuah JOIN ke tabel itu sendiri.

SELECT w1.WorkerId, w1.FullName, w1.ManagerId, w2.FullName AS ManagerName
FROM Worker AS w1 INNER JOIN Worker AS w2 ON w2.WorkerId = w1.ManagerId

Hasilnya…

Satu Level

Satu Level

Bagaimana jika kamu disuruh menampilkan data manager untuk semua orang secara lengkap? 😀

Disinilah recursive query diperlukan

WITH WorkerList(WorkerID, FullName, ManagerName) AS
(
	SELECT
		Worker.WorkerId,
		Worker.FullName,
		CAST('' AS  nchar(20)) as ManagerName
	FROM Worker
		WHERE (Worker.ManagerId IS NULL)
	UNION ALL
	SELECT
		Worker.WorkerId,
		Worker.FullName,
		WorkerList.FullName AS ManagerName
	FROM Worker
		INNER JOIN WorkerList ON
		WorkerList.WorkerId = Worker.ManagerId
)
SELECT * FROM WorkerList

As you can see, kita membuat sebuah with Expression bernama WorkerList, dan jika kamu notice di UNION ke dua.. ada INNER JOIN ke WorkerList. (with yang isinya mengacu pada with itu sendiri.. sebuah rekursi!)

WITH itu merupakan Common Table Expression, bayangkan itu sebagai temporary-table (variabel) yang bisa digunakan berkali-kali dan mereferensi ke dirinya secara rekursif.

And here is the result….

N Level Hierarchy

N Level Hierarchy

Hierarki tree yang rekursif 🙂

Mentransformasi XML menggunakan XSLT di C#

Kode dibawah ini akan mereturn hasil transformasi file XML yang disebutkan di “file_source” menggunakan XSLT yang disebutkan di “file_style”.

public static string GetXslTransform(
  string file_source,
  string file_style)
{
  string strHtml;

  XslCompiledTransform x = new XslCompiledTransform();
  
  // Load the XML 
  XPathDocument doc = new XPathDocument(file_source);

  // Load the style sheet.
  XslCompiledTransform xslt = new XslCompiledTransform();
  xslt.Load(file_style);
  MemoryStream ms = new MemoryStream();
  XmlTextWriter writer = new XmlTextWriter(ms, Encoding.ASCII);
  StreamReader rd = new StreamReader(ms);
  xslt.Transform(doc, writer);
  ms.Position = 0;
  strHtml = rd.ReadToEnd();
  rd.Close();
  ms.Close();
  return strHtml;
}