Upgrade στο σχήμα της βάσης μας σέ νέο Version για SQL2000

Στο συγκεκριμμένο θέμα θα δούμε πώς μπορούμε νά κάνουμε upgrade του σχήματος της βάσης μασ σέ νέο version ακόμα και όταν το version που είναι εγκατεστημμένο είναι πολύ παλαιότερο και δέν θελουμε να τρέξουμε όλα τά προηγούμενα patches που μπορεί νά υπάρχουν.

Ας υποθέσουμε ότι έχουμε ένα πινακα στην βάση μας όπως παρακάτω.

myTable
(
 columnA INT not null,
 columnB varchar(10) not null,
 columnC varchar(60) null
 columnD varchar(20) null
 columnE float default(0)
)

και θέλουμε τώρα νά τον κάνουμε upgrade στην νέα version

myTable
(
 columnA INT not null,
 columnB varchar(10) not null,
 columnC varchar(60) null
 columnD varchar(20) null
 columnE float default(0)
 columnF smallint default(0),
 columnG numeric(28,2) default(0)
)

σίγουρα θά μπορούσαμε νά τρέξουμε ένα Alter statement και αυτό νά πραγματοποιηθεί.Αλλά η column columnF έχει δημιουργηθεί σέ προηγούμενο version της εφαρμογής μας το οποίο και δέν έχει εγκατασταθεί.Πώς θα μπορούσαμε να κάνουμε την νέα εγκατάσταση χωρίς να χρειάζεται να τρέξουμε το προηγούμενο set εγκατάστασης?

Λοιπόν έχουμε καταρχάς δημιουργήσει στην βάση μας την παρακάτω Function

create function dbo.DynSqlInsert 
  (
   @tblName varchar(255),
          @type smallint --0 Δημιουργία Insert Statment,1 Δυμιουργία Select Stament
  )
returns varchar(8000)
as
begin
 declare @objId int,@retString  varchar(8000),@name varchar(255)
 select @retString=''
 select @objId=id from sysobjects where name=@tblName

DECLARE cur1 cursor for
select name from syscolumns where
id=@objId
open cur1
fetch next from cur1 into @name
  while @@fetch_status=0
    begin
     set @retString=@retString+','+@name
fetch next from cur1 into @name
end
close cur1
deallocate cur1
if @type=0
begin
select @retString='insert into TMP_' + @tblName + '
('+substring(@retString,2,len(@retString))+')'
end
else
begin
select @retString='select '+substring(@retString,2,len(@retString))+' from
'+@tblName+' TABLOCKX'  ---΄΄Κλειδώνουμε τον πίνακα
end
return @retString
end

Τώρα μπορούμε να προχωρήσουμε στο επόμενο στάδιο.Δημιουργούμε τον πίνακα που θέλουμε μέ το πρόθεμα TMP_ όπως παρακάτω

Create table TMP_myTable
(
 columnA INT not null,
 columnB varchar(10) not null,
 columnC varchar(60) null
 columnD varchar(20) null
 columnE float default(0)
 columnF smallint default(0),
 columnG numeric(28,2) default(0)
)

Κατόπιν δηλώνουμε δύο μεταβλητές @str1 varcahr(8000),@str2 varchar(8000) και τους περνάμε της τιμές που γυρίζουν κατά περίπτωση από την παραπάνω function

declare @str1 varchar(8000),@str2 varchar(8000)
  select @str1=dbo.DynSqlInsert('myTable',0),@str2=dbo.DynSqlInsert('myTable',1)

τά στοιχεία που γυρίζουν ένα τα παρακάτω

insert into TMP_myTable (columnA,columnB,columnC,columnD,columnE)
select columnA,columnB,columnC,columnD,columnE from myTable TABLOCKX

οπότε μπορούμε νά δημιουργήσουμε το insert Statment των Data στον νέο πίνακα εκτελώντας

exec (@str1+' '+@str2)

Κατόπιν κάνουμε drop τον παλιό πίνακα και rename τον καινούργιο

DROP TABLE myTable

EXECUTE sp_rename N'TMP_myTable', N'myTable', 'OBJECT'

Έτσι λοιπόν μπορούμε σέ ένα αρχείο νά έχουμε δημιουργήσει το τελευταίο σχήμα της βάσης μας και απο τον client να γίνει το upgrade.

Σημείωση :

Σε SQL2005 δέν έχει δοκιμαστεί.

 

Share


Έχουν δημοσιευτεί Πέμπτη, 23 Φεβρουαρίου 2006 9:30 πμ από το μέλος imanos
Καταχώρηση στις κατηγορίες:

Σχόλια:

Χωρίς Σχόλια