Friday, October 8, 2010

Drop Primary key pada SQL Server

Terkadang loe smua pasti agak susah yaa.. tuk hapus primary key mungkin maksud gw disini tuh klo loe smua pake query agak ribet crita nya..

Biasa nya standar coding yang loe pake khan
Alter table [nama table]
Drop [nama key]

nah mnurut gw sih ini agak lumayan memusingkan, coz loe harus tau key nya apa? sebab jika loe pake primary key dalam suatu table didalam MS.SQL Server maka dengan sendiri nya server akan membentuk atau membuat sejenis index key contoh nih PK___key__Hjdk23UK.

nah untuk smua table beda pula index yg didapet,

disini gw cuma mo berbagi aja. gw punya store procedure, loe tinggal copy aja coding nya trus loe jalanin deh..

CREATE PROCEDURE [dbo].[DropPrimaryKey]
@tableName Varchar(255)
AS

DECLARE @pkName Varchar(255)

SET @pkName= (

SELECT [name] FROM sysobjects
WHERE [xtype] = 'PK' AND [parent_obj] = OBJECT_ID(N'[dbo].[' + @tableName + ']')

)
DECLARE @dropSql varchar(4000)

SET @dropSql=
'ALTER TABLE [dbo].['+@tableName+']
DROP CONSTRAINT ['+@PkName+']'
EXEC(@dropSql)
GO


Nah jika loe mau jalanin ketik aja :
EXEC [dbo].[DropPrimaryKey] @TableName='namatable'


Mudah khan... ya nama nya juga usaha..

tolong beri komentar ya klo mampir... :)

Membandingkan 2 store prosedur pada my sql

Gw lagi Searching dan browsing eh nemu yang bagus nih.. gw pikir smakin banyak nyang naro pasti nyang butuh juga cepet nemu nya dah.. simak aje crite di bawah nih..

Pernah coding secara massive di pemrograman internal DBMS makae stored procedures/functions?
Bekerja dalam tim?
Punya beberapa database yang dipakae dalam setiap fase development? misal :

* db_ini_dev : dikonsumsi oleh para coder-coder cakep kita
* db_ini_test : dikonsumsi oleh para tester-tester cantik kita
* db_ini : dikonsumsi ama client-client baik kita

Atau pernah bekerja dalam tim yang tersebar di beberapa tempat yang terpisah, dimana masing-masing punya local database untuk kegiatan coding masing-masing?

* db_ini_dev_bandung : dikonsumsi oleh para coder-coder cakep kita di Buah Batu Regency
* db_ini_dev_solok : dikonsumsi oleh para coder-coder tampan kita di Perumnas Koto Baru Solok
* db_ini_test : di-host di sebuah server public dengan spesifikasi medium di sebuah gedung di Kuningan, Jakarta
* db_ini : di host di server public yang sama dengan db_ini_test

Ketika small-release udah digulirkan, mau-ngga-mau setiap perubahan struktur database (tabel/routines/trigger/view) harus di-broadcast ke database-database kita tersebut.

Puyeng meng-analisis diferensial?

Silakan coba trik gw untuk membandingkan stored procedures antara dua database di bawah ini. (Owya, gw pakae MySQL 5 -- dan trik ini hanya bisa jalan di MySQL 5 ke atas)

Ini script gw untuk "mendeteksi" apakah ada SP yang beda definisi (atau SP baru) dari dua database yang identik. Silakan donlot di sini :

http://qvezst.googlepages.com/xp_routines_compare.zip

Pertama-tama yang harus dilakukan adalah dengan meng-execute ntu script ke database mysql. Yupe! Database mysql (ini merupakan database yang 'pasti ada' di setiap engine MySQL Server -- yang isinya adalah informasi user, informasi schema, de-el-el). Klo sukses ke-attach, ntar di database mysql loe bakal nambah 2 stored procedure yang namanya xp_execute dan xp_routines_compare.

xp_execute adalah routine yg gw bikin untuk memudahkan pemanggilan PREPARED STATEMENTS di dalam stored routines, daripada tiap kali harus nulis PREPARE ... EXECUTE ... DEALLOCATE -- mending tinggal panggil call xp_execute("select blablabla");

dan xp_routines_compare, adalah inti dari artikel ini -- memiliki dua parameter input yaitu SOURCE DATABASE NAME dan TARGET DATABASE NAME. Untuk meng-compare dua database, loe masukin aja nama-nama database yg mo loe bandingin tersebut dalam format string (alias loe kasi kutip satu ato kutip dua). Kalo bingung, coba loe liat sampel pemanggilan ntu procedure di bawah ini :

mysql>call mysql.xp_routines_compare('ekomit_dbrisma','ekomit_dbrisma_test');
+------------------------------------+--------------------------------------+
| routine_yg_berbeda | letak_perbedaan |
+------------------------------------+--------------------------------------+
| sf_psb_get_nama_sekolah | routines baru di db : ekomit_dbrisma |
| sf_report_get_count | routines baru di db : ekomit_dbrisma |
| sf_statistik_getcount | routines baru di db : ekomit_dbrisma |
| sp_disdik_kategori_laporan | routines baru di db : ekomit_dbrisma |
| sp_disdik_lihat_laporan | routines baru di db : ekomit_dbrisma |
| sp_psb_cluster_daftar_sekolah_save | PARAMETER BODY |
| sp_psb_sekolah_luar_cluster_combo | BODY |
| sp_psb_sekolah_prs_view | PARAMETER BODY |
| sp_psb_sekolah_prs_view1record | routines baru di db : ekomit_dbrisma |
| sp_stats_agama | routines baru di db : ekomit_dbrisma |
| sp_thnajaran_kini_dan_sebelumnya | routines baru di db : ekomit_dbrisma |
| xf_properdate | BODY |
+------------------------------------+--------------------------------------+
12 rows in set


Yak! akan terlihat di mana letak perbedaan routines di dalam dua database tersebut yang akan terdeteksi beda dari ntu routines ada di PARAMETER, di BODY, atau beda di RETURN (khusus stored functions). Dan klo ada routine baru, akan langsung di-kasih-tau ntu routines baru ada di database mana..

Gimana-gimana? Keren kan?

Oh iya, -- mencoba obyektif -- gw juga pengen beritaukan LIMITASI dalam pengimplementasian xp_routines_compare() gw ini, yaitu :

* xp ini hanya bisa di call ama user yang punya GRANT PRIVILEGES sekelas root -- atau minim punya privileges SELECT ke database mysql.
* ngga bs nge-compare dari 2 databases yang BERBEDA ENGINE -- karena database yang beda engine artinya beda database mysql nya.. Ntar lah kapan-kapan gw coba bikin versi cross-engine-nya (manfaatin fitur mysql replikasi, tentunya)