|
Sincronizare SQLServer Express
Last post 10-26-2009, 8:03 PM by BGeo. 60 replies.
-
08-27-2007, 11:12 AM |
-
rremus
-
-
-
Joined on 11-16-2006
-
-
sysadmin
-
-
|
Re: Sincronizare SQLServer Express
@msgtype trebuie sa fie SYSNAME sau NVARCHAR(128), nu VARCHAR(10)
http://rusanu.com
|
|
-
08-27-2007, 11:45 AM |
-
crestinul
-
-
-
Joined on 09-23-2006
-
-
sysadmin
-
-
|
Re: Sincronizare SQLServer Express
am facut asa :
declare @msg xml,@msgtype nvarchar(128)
dar tot nu merge adica tot nule sunt amandoua 
De fapt cred ca procedura nici nu se mai lanseaza acu cand intra ceva in coada desi am schimbat activate la coada pe on
Secolul XXI ori va fi religios ori nu va fi deloc
|
|
-
08-29-2007, 11:57 AM |
-
rremus
-
-
-
Joined on 11-16-2006
-
-
sysadmin
-
-
|
Re: Sincronizare SQLServer Express
Codul nu o ia pe latura ELSE, ci pe IF, insa functia dbo.boys este incorecta. Recomandarea mea este sa executzi procedura manual, din Management Studio cu exec [dbo].[repl_insert] pina cind este corecta si abia apoi sa activezi procedura pe queue.
http://rusanu.com
|
|
-
08-29-2007, 2:38 PM |
-
crestinul
-
-
-
Joined on 09-23-2006
-
-
sysadmin
-
-
|
Re: Sincronizare SQLServer Express
Am executat functia boys am testat-o si-mi face shreding la xml-ul cu datele inserate.
Adica am testat-o cuun xml generat cu select for xml de forma aia ,din baza de pe sender.Ar insemna ca,crapa la insertul ala da nu itneleg de ce ,o sa mai sap
Multumesc mult
Secolul XXI ori va fi religios ori nu va fi deloc
|
|
-
08-31-2007, 3:48 PM |
-
crestinul
-
-
-
Joined on 09-23-2006
-
-
sysadmin
-
-
|
Re: Sincronizare SQLServer Express
Am creat pe receptor o tabela cu doua coloane msg xml si msgtyoe nvarchar(10)
AM comentat inserturile alea,si am pus sa-mi insereze in tabela asta mesgtype si msg care le primeste,si am null imi insereaza de fiecare data cand trimit un mesaj un rand null.
Asta e codul proceduri de activare
ALTER PROCEDURE [dbo].[repl_insert]
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
declare @conversation uniqueidentifier
declare @msg xml,@msgtype nvarchar(128)
SET NOCOUNT ON;
begin transaction
; receive top(1) @conversation=conversation_handle,@msgtype=message_type_name,@msg=message_body from replicare
--if (@msgtype='insertie')
--insert into tbl_boy select * from boys(@msg)
-- -- Insert statements for procedure here
--else
--insert into tbl_boy values(@msgtype,-1,-1)
insert into mesaje values(@msg,@msgtype)
commit
end conversation @conversation
END
Nu-mi dau seama care e buba 
Secolul XXI ori va fi religios ori nu va fi deloc
|
|
-
09-03-2007, 1:26 PM |
-
rremus
-
-
-
Joined on 11-16-2006
-
-
sysadmin
-
-
|
Re: Sincronizare SQLServer Express
Tabela mesaje are o singura coloana numita [mesaj] de tip XML. Deci insert-ul nu se poate compila:
Msg 213, Level 16, State 1, Procedure repl_insert, Line 17 Insert Error: Column name or number of supplied values does not match table definition.
Ca sa pot sa te ajut te rog sa te asiguri ca codul SQL care-l postezi poate fi compilat. Problema trebuie sa fie in continuare in codul tau pentru ca variabilele au valoarea corecta, dupa cum se poate vedea cu un simplu SELECT:
ALTER PROCEDURE [dbo].[repl_insert] AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements.
declare @conversation uniqueidentifier declare @msg xml,@msgtype nvarchar(128) SET NOCOUNT ON; begin transaction ;receive top(1) @conversation=conversation_handle,@msgtype=message_type_name,@msg=message_body from replicare select @conversation, @msgtype, @msg commit END
GO
exec [repl_insert]
Resulta:
5728A4E5-3A52-DC11-AC20-0013723DF0DA insertie <boys><boy FirstName="dfdfdf" Counter="0" Year="88" /></boys>
http://rusanu.com
|
|
-
09-03-2007, 9:40 PM |
-
crestinul
-
-
-
Joined on 09-23-2006
-
-
sysadmin
-
-
|
Re: Sincronizare SQLServer Express
rremus:
Tabela mesaje are o singura coloana numita [mesaj] de tip XML. Deci insert-ul nu se poate compila:
Msg 213, Level 16, State 1, Procedure repl_insert, Line 17 Insert Error: Column name or number of supplied values does not match table definition.
Ca sa pot sa te ajut te rog sa te asiguri ca codul SQL care-l postezi poate fi compilat. Problema trebuie sa fie in continuare in codul tau pentru ca variabilele au valoarea corecta, dupa cum se poate vedea cu un simplu SELECT:
ALTER PROCEDURE [dbo].[repl_insert] AS BEGIN -- SET NOCOUNT ON added to prevent extra result sets from -- interfering with SELECT statements.
declare @conversation uniqueidentifier declare @msg xml,@msgtype nvarchar(128) SET NOCOUNT ON; begin transaction ;receive top(1) @conversation=conversation_handle,@msgtype=message_type_name,@msg=message_body from replicare select @conversation, @msgtype, @msg commit END
GO
exec [repl_insert]
Resulta:
5728A4E5-3A52-DC11-AC20-0013723DF0DA insertie <boys><boy FirstName="dfdfdf" Counter="0" Year="88" /></boys>
Pai am modifcat-o si i-am pus si tip mesaj si-mi insereaza rand null.
O sa pun o coloana vbarchar pt idconversatie sa-l inreg si pe ala ca sa fiu sigur
Secolul XXI ori va fi religios ori nu va fi deloc
|
|
-
09-07-2007, 8:49 AM |
-
crestinul
-
-
-
Joined on 09-23-2006
-
-
sysadmin
-
-
|
Re: Sincronizare SQLServer Express
finally a ,ers se insereaza
asta e codul castigator
begin transaction
; receive top(1) @conversation=conversation_handle,@msgtype=message_type_name,@msg=message_body from replicare
select @msgtype
select @msg
if (@msgtype='insertie')
begin
exec sp_xml_preparedocument @idoc output,@msg
insert into tbl_boy select * from openxml(@idoc,'/boys/boy') with (FirstName varchar(20),Counter int,Year int,id int)
exec sp_xml_removedocument @idoc
end
-- Insert statements for procedure here
--else
--insert into tbl_boy values(@msgtype,-1,-1)
--insert into mesaje values(@msg,@msgtype)
commit
end conversation @conversation
Inca o intrebare la contractul respectiv vreau sa ma adaug doua tipuri de mesaje stergere si actualizare ca sa fac replicarea complet.
AM vazut ca nu am alter contract cum pot face asta trebuie neaparat sa creez contractul dinnou?
Multumesc
Secolul XXI ori va fi religios ori nu va fi deloc
|
|
-
-
06-11-2009, 1:05 PM |
-
BGeo
-
-
-
Joined on 06-11-2009
-
Brasov
-
db_datawriter
-
-
|
Re: Sincronizare SQLServer Express
Salutare, poate ma ajutati putin sa readuc la viata acest topic... In primul rand, multumiri lui Remus si tuturor celor care au ajutat la acest subiect. Fara informatiile oferite de ei nu cred ca ma descurcam... M-am jucat putin cu Service Broker, mi se pare foarte interesant si puternic. Este exact ce aveam nevoie pentru "plimbat" informatii intre o instanta de SQL Server normala si mai multe instante Express Edition (un fel de replicare a datelor). Acum am o intrebare, cum este recomandat sa implementezi (la nivel de cozi, contracte, proceduri stocate) aceasta sincronizare ? Mai clar spus, sa las o singura coada, si din toate triggerele de pe tabele, sa trimit mesajele si XML-ul cu datele efective pentru replicare prin acea coada, iar la destinatie, sa actualizez datele in functie de tabela din care au venit ? Sau este mai bine sa fac cate o coada / contract pentru fiecare tabela din care vreau sa plimb datele ?
Drive safe !
|
|
-
06-15-2009, 1:13 PM |
-
crestinul
-
-
-
Joined on 09-23-2006
-
-
sysadmin
-
-
|
Re: Sincronizare SQLServer Express
Pai intai iti definesti endpointurile prin care o sa comunice cele doua instante ssb
apoi
O instanta ssb pt receptor si sender.
Si din ce imi aduc eu aminte o instanta service broker implementeaza numai un contract si foloseste numai o coada.
Cred,ca corespondenta e de unu la unu adica
contract->ssb instance->queue
Secolul XXI ori va fi religios ori nu va fi deloc
|
|
-
07-17-2009, 6:09 PM |
-
BGeo
-
-
-
Joined on 06-11-2009
-
Brasov
-
db_datawriter
-
-
|
Re: Sincronizare SQLServer Express
Toate bune si frumoase, m-am documentat, m-am jucat, si mi-a iesit jumatate din problema, adica trimiterea datelor intr-un scenariu "many-to-one". Exemplele de aici : http://www.sqlteam.com/article/centralized-asynchronous-auditing-across-instances-and-servers-with-service-broker mi-au fost foarte utile. La ce m-am blocat acum, este partea "one-to-many"; nu stiu cum sa trimit datele de la "sediul central" catre "filiale". Am sa zicem 3 tabele "nomenclator", pe care vreau sa le trimit la "filiale". Am facut acelasi lucru cu trigger pe tabele, care genereaza un XML, XML-ul asta este trimis catre procedura catre trimite dialogurile catre serviciile "filialelor". Insa nu-mi dau seama cum sa editez aceasta procedura, ca sa trimit datele modificate dintr-o tabela "nomenclator", catre toate filialele. Banuiesc ca aici este spilul : -- Begin the dialog, with the new Id BEGIN DIALOG CONVERSATION @dlgId FROM SERVICE [tcp://10.0.3.160:4022/TestDb1/Audit/DataSender] TO SERVICE '//Audit/DataWriter', -- this is a MasterAuditDatabase Service Broker Id -- (change it to yours and remove < and >) '5E929454-43FA-4793-98FA-EB8647E1D313' ON CONTRACT [//Audit/Contract] WITH ENCRYPTION = OFF; sa trimit la fiecare serviciu de la filiale (stiind acel service broker ID). Insa nu-mi iese ! Plus ca n-as vrea ca de fiecare data cand adaug o filiala, sa modific aceasta procedura stocata (adica sa scriu "in clar" acel id, si sa fac send pentru fiecare id)... Ce ma sfatuiti ?
Drive safe !
|
|
-
07-18-2009, 3:31 AM |
-
rremus
-
-
-
Joined on 11-16-2006
-
-
sysadmin
-
-
|
Re: Sincronizare SQLServer Express
Uite cum te sfatuiesc eu sa faci: fiecare filiala incepe ea o conversatie cu sediul central si trimite un mesaj cu semnificatia de 'subscriu la nomenclatoare'. Sediul central primeste mesajul si depoziteaza conversatia intr-o tabela de 'subscrisi'.
Cind se fac modificari la nomenclator, se trimite cite un update la fiecare conversatie din 'subscrisi'. In felul asta sediul central nu are hard-coded filialele. Pe massura ce noi filiale sint deschis, ele 'subscriu' si apoi incep sa primeasca innapoi nomenclatorul la care au 'subscris'. Mesajele de update de nomenclator curg de la 'target' (sediul central) la 'initiator' (la filiale), ca mesaje de raspuns la mesajul original de 'subscriu'. I-tzi poti permite asta pentru ca conversatiile SSB sint de lunga durata si pot dura si ani de zile.
Cind o filiala se modifica, desfiinteaza etc ea inchide conversatia si sediul central primeste mesajul de erroare sau de EndConversation, si sterge conevrsatia din atbela de 'subscrisi'.
http://rusanu.com
|
|
-
10-26-2009, 5:27 PM |
-
BGeo
-
-
-
Joined on 06-11-2009
-
Brasov
-
db_datawriter
-
-
|
Re: Sincronizare SQLServer Express
Dupa lupte seculare, am pus pe picioare "replicarea" intre instante diferite. Toate bune si frumoase, datele se transmit, conversatiile se inchid, etc... Insa ma roade ceva, ma uit in profiler, si dupa ce curg toate mesajele cum ar trebui sa curga (bine, ma rog, dupa cate ma pricep eu) vine si un mesaj Broker :: Connection, subclass "4 - Closing", cu textul "An error occurred while receiving data: '64(The specified network name is no longer available.)'." Asta doar pe sender, pe receiver totul pare ok, niciun mesaj de eroare. Ce se intampla mai exact ? In plus, mi se pare ciudat, ca la sender apare in campul ObjectName, adresa IP corecta a receiverului, cu portul aferent, exact cum le-am setat eu. Insa la receiver, sender-ul apare pe portul 0 ! Cu toate ca sunt puse amandoua pe 4022.... Sender :  Receiver :  P.S. Folosesc tehnicile descrise de Remus (inca odata multumesc, pentru toate explicatiile date !), si dupa 5 minute, timer-ul inchide conversatia. Later edit : M-am jucat si am rutat mesajele prin alta instanta. Acum, si pe sender, si pe receiver, imi apare acea eroare la evenimentul de closing... Pe "router" nu-mi apare nicio eroare in profiler ! Si la fel, in campul object, sender-ul apare de forma tcp://IP:0, iar receiver-ul are si portul corect (tcp://IP:4022)... nu mai inteleg nimic !
Drive safe !
|
|
-
10-26-2009, 7:37 PM |
-
rremus
-
-
-
Joined on 11-16-2006
-
-
sysadmin
-
-
|
Re: Sincronizare SQLServer Express
Poti ignora mesajul asta fara, nu indica o problema. SSB inchide conexiunile automat (dupa 1 minut de non-activate parca). Unul din servere va fi totdeuna primul care inchide, si cind se intimpla asta celalat va raporta evenimentul care-l vezi tu.
Despre tcp://IP:0 este tot OK. Serverul care accepta o conexiune va pune '0' ca portul la 'peer'.
http://rusanu.com
|
|
Page 4 of 5 (61 items)
4
|
|
|