Welcome to Sign in | Help

Re: Solutia optima pentru aplicatie distribuita.

  •  10-03-2008, 1:49 PM

    Re: Solutia optima pentru aplicatie distribuita.

    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
View Complete Thread
Powered by Community Server (Commercial Edition), by Telligent Systems