Tuesday, November 21, 2006

SQL Server 2005 - AdventureWorks (bag. 1)

Jika kita mempelajari sql server 2005, kita tidak akan pernah tidak menyentuh database Adventureworks. database ini sangat bagus untuk kita absorb sebagai panduan untuk membuat database design aplikasi ERP. walaupun masih terasa simple, tapi tetap, database adventureworks sudah mencakup sebagian modul ERP seperti sales, purchase, production/manufacturing dan human resource.Seperti telah dibilang bahwa adventureworks masih dianggap simple database design, maka ada perlu penambahan-penambahan objek/table supaya dapat teraplikasikan di proses bisnis sebenarnya. salah satunya adalah pada pada saat input stock untuk inventory. Pada adventureworks, input stock langsung diarahkan ke table productinventory setelah proses purchase order.

Permasalahaannya adalah jika kita akan melakukan input stok awal. Kita tidak bisa langsung menginput melalui proses purchase order, karena ini bukan hal yang benar. Oleh karena itu, harus dibuat satu proses lagi yaitu input jurnal stok.

Adapun script object dari input jurnal stok, yang kita namakan table productjournal, sebagai berikut :
CREATE TABLE [ProductJournal] (
[ProductJournalID] [int] IDENTITY (1, 1) NOT NULL ,
[PostingDate] [datetime] NULL ,
[EntryType] [int] NULL ,
[ProductID] [int] NULL ,
[LocationKey] [int] NULL ,
[Quantity] [int] NOT NULL CONSTRAINT [DF_ProductJournal_Quantity] DEFAULT (0),
[Shelf] [nvarchar] (10) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
[Bin] [tinyint] NOT NULL ,
[UnitPrice] [money] NOT NULL ,
[status] [bit] NULL CONSTRAINT [DF_ProductJournal_status] DEFAULT (0),
CONSTRAINT [PK_ProductJournal] PRIMARY KEY CLUSTERED
(
[ProductJournalID]
) ON [PRIMARY]
) ON [PRIMARY]
GO

Keterangan:kolom EntryType terdiri dari 4 : Purchase order, Sales Order, Positive Adjustment, Negative Adjustment.

SQL Server 2005 - AdventureWorks (bag. 2)

Ini adalah script object purchaseorderdetail milik adventureworks:
CREATE TABLE [PurchaseOrderDetail] ( [PurchaseOrderID] [int] NOT NULL ,
[PurchaseOrderDetailID] [int] IDENTITY (1, 1) NOT NULL ,
[DueDate] [datetime] NOT NULL ,
[OrderQty] [smallint] NOT NULL ,
[ProductID] [int] NOT NULL ,
[UnitPrice] [money] NOT NULL ,
[LineTotal] AS (isnull(([OrderQty] * [UnitPrice]),0.00)) ,
[ReceivedQty] [decimal](8, 2) NOT NULL ,
[RejectedQty] [decimal](8, 2) NOT NULL ,
[StockedQty] AS (isnull(([ReceivedQty] - [RejectedQty]),0.00)) ,
[ModifiedDate] [datetime] NOT NULL CONSTRAINT [DF_PurchaseOrderDetail_ModifiedDate] DEFAULT (getdate()),
CONSTRAINT [PK_PurchaseOrderDetail_PurchaseOrderID_PurchaseOrderDetailID] PRIMARY KEY CLUSTERED
(
[PurchaseOrderID],
[PurchaseOrderDetailID]
) ON [PRIMARY]
) ON [PRIMARY]
GO

Jika kita akan mengimplementasikan Purchase order Adventureworks pada aplikasi kita, maka ada beberapa tambahan yang perlu dilakukan. salah satunya adalah penambahan kolom PPN di table purchaseorderdetail.
"Padahal khan di purchaseorderheader sudah ada kolom PPN ?"
Benar, yang diperlukan adalah sedikit modifikasi yaitu kolom pajak yang ada di purchaseorderheader kita anggap sebagai akumulasi nilai PPN dari tiap-tiap item pada purchase order detail.Jika kita pernah melihat purchase order milik Microsoft Dynamic - navision, kita akan melihat juga bahwa setiap item diinput PPN-nya.

SQL Server 2005 - Tips-tips (bag. 1)

1. Jika kita me-manage db yang memiliki table dengan banyak index, dan ternyata performance-nya semakin menurun, maka kita bisa mengira bahwa ada index yang tidak terpakai. Untuk menemukan index yang tidak terpakai, kita bisa menggunakan dynamic view : sys.dm_db_index_usage_stats

2. Jika kita punya proses import data tiap malam, kita ingin memastikan data yang sudah ada akan ter-update. Jika kebetulan record tidak ada, maka data akan di insert. Yang perlu kita lakukan adalah membuat sebuah CLR trigger.
Menurut BOL:
Triggers written in a CLR language differ from other CLR integration objects in several significant ways. CLR triggers can:
� Reference data in the INSERTED and DELETED tables
� Determine which columns have been modified as a result of an UPDATE operation
� Access information about database objects affected by the execution of DDL statements.
� These capabilities are provided inherently in the query language, or by the SqlTriggerContext class.

3. jika kita ingin membuat aplikasi yang dapat menyimpan dokumen asli sebagai dokumen xml dan bisa di ambil persis seperti aslinya, kita bisa melakukannya dengan membuat kolom bertipe xml.

4. Jika kita ingin memastikan view yang kita buat tidak terpengaruh oleh modifikasi table, maka saat create view pastikan menambah �WITH SCHEMABINDING�. Artinya, ketika kita mengubah table, sql server akan memunculkan eror karena ada view yang bergantung pada table tersebut.

Friday, November 17, 2006

SQL Server 2005 - Log shipping

Gambaran mudah untuk melakukan log shipping.
1. backup transaction log dari database primer.
2. copy file log ke database sekunder. harus server yg terpisah.
3. restore file log ke server sekunder.

gambaran ini (katanya)gampang dilakukan melalui sql server management studio.
1. klik kanan db yang akan dijadikan db primer > pilih ship transaction log
2. jika muncul window baru, centang checkbox yang tertulis "Enable this as primary database in a log shipping configuration.
3. tekan tombol "Backup Settings" > Tentukan db sekunder.
4. settingan selanjutnya boleh ditentukan sesuai keinginan.
5. klik ok

SQL Server 2005 - Database Mirroring

Database mirroring terdiri dari
1. database principal. Sumber database.
2. database mirror. database yg menerima copy dari database principal.
3. database standby. kalo diperlukan. Bertindak sebagai switch.

Step untuk membuat database mirroring.
1. konfigurasi sekuriti dan komunikasi antar instance.
=> Gunakan CREATE ENDPOINT.

2. Buat database mirror.
=> lakukan restore terhadap full backup dari database principal.
=> penting, gunakan NORECOVERY ketika me-restore.

3. Buat mirror session.
=> Ini adalah bagian penting dari database mirroring. Tentukan Partner dan witness.
=> => Konfigurasi database principal sebagai partner database mirror
* ALTER DATABASE [database_name]
SET PARTNER = [ server_network_address ]
=> => Konfigurasi database mirror sebagai partnet database principal. Perintahnya sama dengan point A.
* ALTER DATABASE [ database_name ]
SET PARTNER = [ server_network_address ]
=> => Konfigurasi witness.