ok ... am pentru varianta online solutia cu triggere ... din pacate nu pot sa fac upload la fisiere (poate puneti o vorba buna la admin).
Restrictiile "pe moment" sunt:
- definitie de tabela sa fie mai mica de 8000 (suma dimensiuni campuri)
-daca tabela are key ... sa fie pe prima coloana
- coloanele autoincrement sa se stie (ca sa le elimin din lista de replicare)
- nu se folosesc campuri text, ntext image
Am realizat un "template" de trigger pe care apoi l-am "aplicat" pe toate tabelele din bazele de pe 2 servere cu ajutorul unei aplicatii care citeste structura tabelelor si seteaza variabilele din template.
Pun un exemplu pentru o tabela banci.
CREATE TRIGGER [REPLBANCI] ON [dbo].[BANCI]
FOR INSERT, UPDATE, DELETE
AS
DECLARE @strAction AS VARCHAR(10)
DECLARE @STRTABLENAME AS VARCHAR (100)
DECLARE @STRCMD AS NVARCHAR (1000), @STRCMD1 AS NVARCHAR (1000)
DECLARE @Column_Name AS VARCHAR (50), @Type_Name AS VARCHAR (50)
DECLARE @DeletedRows AS INT
DECLARE @InsertedRows AS INT
DECLARE @nIndex AS INT
SELECT * INTO #inserted FROM inserted
SET @InsertedRows = @@rowcount
SELECT * INTO #deleted FROM deleted
SET @DeletedRows = @@rowcount
IF @InsertedRows > 0
BEGIN
IF @DeletedRows > 0
SET @strAction = 'UPDATE'
ELSE
SET @strAction = 'INSERT'
END
ELSE
BEGIN
SET @strAction = 'DELETE'
END
-- DELETE
IF 'DELETE' = @strAction
BEGIN
SET @STRCMD = ' delete from [SRVDB2\SQL4].bcMainM2008.dbo.BANCI where BANCAID in (select BANCAID from #deleted)'
-- disable trigger
SET @strCMD1 = 'ALTER TABLE BANCI DISABLE TRIGGER REPLBANCI'
EXECUTE [SRVDB2\SQL4].bcMainM2008.DBO.SP_EXECUTESQL @strCMD1
--
EXECUTE(@STRCMD)
-- enable trigger
SET @strCMD1 = 'ALTER TABLE BANCI ENABLE TRIGGER REPLBANCI'
EXECUTE [SRVDB2\SQL4].bcMainM2008.DBO.SP_EXECUTESQL @strCMD1
END
-- INSERT
IF 'INSERT' = @strAction
BEGIN
SET @STRCMD = ' INSERT INTO [SRVDB2\SQL4].bcMainM2008.dbo.BANCI select BANCAID,NUME,CODBANCA,CODSWIFT,LOCALITID,LOCALIT,JUDETID,TARAID,TIPBANCA,ISANULAT,ISTEMPORAR,NTIPEXPORT,ADRESA from #inserted '
-- disable trigger
SET @strCMD1 = 'ALTER TABLE BANCI DISABLE TRIGGER REPLBANCI'
EXECUTE [SRVDB2\SQL4].bcMainM2008.DBO.SP_EXECUTESQL @strCMD1
--
EXECUTE(@STRCMD)
-- enable trigger
SET @strCMD1 = 'ALTER TABLE BANCI ENABLE TRIGGER REPLBANCI'
EXECUTE [SRVDB2\SQL4].bcMainM2008.DBO.SP_EXECUTESQL @strCMD1
END
-- UPDATE
IF 'UPDATE' = @strAction
BEGIN
DECLARE @ColumnID int, @Columns nvarchar(4000), @ObjectID int, @LastColumnID int
SET @ObjectID=(SELECT id FROM sysobjects WHERE name='BANCI')
SET @LastColumnID=(SELECT MAX(colid) FROM syscolumns WHERE id=@ObjectID)
SET @ColumnID=1
WHILE @ColumnID
IF (SUBSTRING(COLUMNS_UPDATED(),(@ColumnID - 1) / 8 + 1, 1)) &
POWER(2, (@ColumnID - 1) % 8) = POWER(2, (@ColumnID - 1) % 8)
SET @Columns = ISNULL(@Columns+',','') + COL_NAME(@ObjectID,@ColumnID) + ' = #inserted.' + COL_NAME(@ObjectID,@ColumnID) + ' '
SET @ColumnID=@ColumnID+1
END
-- disable trigger
SET @strCMD1 = 'ALTER TABLE BANCI DISABLE TRIGGER REPLBANCI'
EXECUTE [SRVDB2\SQL4].bcMainM2008.DBO.SP_EXECUTESQL @strCMD1
-- trebuie sa inlocuiesc IN tabela tinta ... coloana @Column_Name
SET @STRCMD = 'UPDATE [SRVDB2\SQL4].bcMainM2008.dbo.BANCI SET ' + @Columns + ' FROM [SRVDB2\SQL4].bcMainM2008.dbo.BANCI C, #inserted WHERE C.BANCAID = #inserted.BANCAID'
EXECUTE(@STRCMD)
-- enable trigger
SET @strCMD1 = 'ALTER TABLE BANCI ENABLE TRIGGER REPLBANCI'
EXECUTE [SRVDB2\SQL4].bcMainM2008.DBO.SP_EXECUTESQL @strCMD1
END
DROP TABLE #inserted
DROP TABLE #DELETED
www.fagadar.ro