Στο συγκεκριμμένο θέμα θα δούμε πώς μπορούμε νά κάνουμε 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 δέν έχει δοκιμαστεί.