Command-line SQL… install vagy amit akartok

Hogy legyen valami kis SQL is a blogomon, megosztom veletek egyik aktuális kedvencemet. (Be kell valljam, hogy alapból nem értek jobban a SQL Serverhez egy átlag foltos tengerimalacnál, de mindig találok valami érdekeset benne, azt elolvasom, aztán akkor abból okos vagyok egy hétig vagy kettőig. De ezt ne mondjátok meg az MS-nek:) Mint visszatérő olvasóim tudják, élek-halok a parancssoros-begépelős-villogókurzoros üzemeltetésért, néha sehogysem értem, hogy hagytam ott a Linuxot fiatalkoromban (aztán mindig eszembe jut, hogy azért, mert X-et két nap alatt tudtam csinálni, hangot meg sohasem a RH7 alatt). És kérem, az SQL Serverben vannak dolgok, amik csak gépeléssel érhetőek el. SQL-t installállni lehet GUI-ból és CLI-ből is – na de editiont upgrade-elni, vagy automatikusan installálni csak parancssorból lehet. Mivel folyton 100 dolgot csinálok, nekem kényelmesebb egy cluster úgy installázni, hogy a fekete ablakba bepötyögöm (vagy copy-paste a BOL-ból):

Start /wait X:\servers\setup.exe /qn VS=<vsname> INSTALLVS=SQL_Engine INSTANCENAME=<instancename> ADDLOCAL=SQL_Engine,Client_Components PIDKEY=<pidkey value with no "-"> ADDNODE=<nodename1 ,NodeName2> GROUP=<diskgroup> IP=<ip ,Networkname> ADMINPASSWORD=<strongpassword> SAPWD=<strongpassord> INSTALLSQLDIR=<installationpath> INSTALLSQLDATADIR=<sharedrivepath> SQLACCOUNT=<domain \user> SQLPASSWORD=<domainuserpassword> AGTACCOUNT=<domain \user> AGTPASSWORD=<domainuserpassword> SQLBROWSERACCOUNT=<domain \user> SQLBROWSERPASSWORD=<domainuserpassword> SQLCLUSTERGROUP="MyDomain\MySQLDomainGroup" AGTCLUSTERGROUP="MyDomain\MyAGTDomainGroup" FTSCLUSTERGROUP="MyDomain\MyFTSDomainGroup" ERRORREPORTING=1, SQMREPORTING=1 SQLCOLLATION=SQL_Latin1_General_CP1_CI_AS

Aztán elmegyek ebédelni, és nem klikkelgetek húsz percet, mire eljutok az installhoz. De nem is ez a legjobb rész benne, hanem az, hogy a cluster install amúgy is szívás: install szerver+kliens az aktív node-ra, majd install kliens (+SSIS) a passzív node-(ok)ra. Minden hotfixnek is ugyanúgy le kell mennie az összes node-ra, mert a nem patchelt kliens cucc az egyik leggonoszabb veszélyforrás. Nem értjük, hogy miért nem működik, pedig jól összekattogtattuk. Ja, a kliens RTM, és rossz queryt futtat a háttérben…

Szóval a lényeg, hogy letolhatom az installt szinte-szinte automatában így scriptelve, megdöbbentően sok paramétert be lehet állítani, soha nem hittem volna, hogy ilyen agyrémek vannak, mint Management Studio shortcut rebuild meg effélék. Az edition upgrade viszont még nagyobb móka volt, konkrétan egy Evaluationt kellett Developerré növesztenem. Össze is raktam a cuki kis parancsot, bedobtam minden elvárt paramétert, aztán mindig elkezdett kérdezgetni, hogy akkir itt az interaktív rész, mondjam meg az instance nevét meg effélék. Némi gondolkodás után sem jöttem rá, hogy ezt most pebkac vagy anti-user-friendly megoldás: van két kapcsoló az installerhez: a /qb basic dialógus ablakokat és hibákat feldob, a /qn pedig semmit, még hibát se. Úgy hal meg, hogy a logba írja, miért tette. Na, én /qb-vel elindultam, és sorban megakadtam. Végül megpróbáltam /qn-nel, és tovább jutottam. Egész eddig:

SQL Server Setup has encountered the following problem: [Microsoft][SQL Native Client][SQL Server]The certificate cannot be dropped because one or more entities are either signed or encrypted using it.. To continue, correct the problem, and then run SQL Server Setup again.

At is mondta persze, hogy A certificate with the name ‘##MS_AgentSigningCertificate##’ already exists or it has already been added to this database. Néztem, mint Rozi a filmszínházban. Irány a gugli (vagy a bing, összevissza használom őket, általában pontosan az egyik keres kedvem szerint), és íme, a megoldás egy fórumban: le kell futtatni egy kis scriptet, és újra megpróbálni:

use msdb

BEGIN TRANSACTION

declare @sp sysname
declare @exec_str nvarchar(1024)
declare ms_crs_sps cursor global for select object_name(crypts.major_id) from sys.crypt_properties crypts, sys.certificates certs where crypts.thumbprint = certs.thumbprint and crypts.class = 1 and certs.name = '##MS_AgentSigningCertificate##'

open ms_crs_sps

fetch next from ms_crs_sps into @sp

while @@fetch_status = 0

begin
 if exists(select * from sys.objects where name = @sp) 
 begin 
  print 'Dropping signature from: ' + @sp set @exec_str =   N'drop signature from ' + quotename(@sp) + N' by certificate [##MS_AgentSigningCertificate##]'
  Execute(@exec_str)
  if (@@error <> 0)
  begin
   declare @err_str nvarchar(1024)
   set @err_str = 'Cannot drop signature from ' + quotename(@sp) + '. Terminating.'
   close ms_crs_sps
   deallocate ms_crs_sps
   ROLLBACK TRANSACTION
   RAISERROR(@err_str, 20, 127) WITH LOG
   return
  end
 end
fetch next from ms_crs_sps into @sp
end

close ms_crs_sps
deallocate ms_crs_sps
COMMIT TRANSACTION
go

A homlokomra csaptam: hogy ez hogy nem jutott eszembe magamtól! És ezután már le is futott az edition upgrade. Mndenféle emberi beavatkozás nélkül. Kocka…

Leave a comment