TR_ACCOUNTSTRUCTURE_INS

Definition

Copy


        CREATE trigger dbo.TR_ACCOUNTSTRUCTURE_INS
        on dbo.ACCOUNTSTRUCTURE
        after insert
        as
        set nocount on

        if (select count(*) from INSERTED) > 0
        begin

            declare @OVs table (ID uniqueidentifier, SEGMENTCOLUMN smallint, ELEMENTTYPECODE tinyint)
            declare @SegmentColumn tinyint
            declare @SQL nvarchar(2000)
            declare @Columns nvarchar(2000)

            update ACCOUNTSTRUCTURE
            set SEGMENTCOLUMN = (select V2.NUM
                from
                (select ID, row_number() over (order by SEQUENCE) as RowNumber
                from dbo.ACCOUNTSTRUCTURE
                where SEGMENTCOLUMN = 0) V1
                inner join
                (select top 30 NUM, row_number() over (order by NUM) as RowNumber
                from dbo.NUMBERS
                where not exists (select * from dbo.ACCOUNTSTRUCTURE where ACCOUNTSTRUCTURE.SEGMENTCOLUMN = NUMBERS.NUM)
                order by NUM) V2
                on V1.RowNumber = V2.RowNumber
                where V1.ID = ACCOUNTSTRUCTURE.ID)
             output inserted.ID, inserted.SEGMENTCOLUMN, inserted.ELEMENTTYPECODE into @OVs
            where SEGMENTCOLUMN = 0

            declare Cur Cursor fast_forward
            for
            select SEGMENTCOLUMN
            from @OVs
            where ELEMENTTYPECODE = 1

                open Cur
                fetch next from Cur into @SegmentColumn
                while @@Fetch_Status = 0
                    begin
                    set @SQL = 'if not exists (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N''[dbo].[LEDGERACCOUNT]'') AND name = N''IX_LEDGERACCOUNT_DATAELEMENT'+convert(nvarchar(2),@SegmentColumn)+'ID_DYN'')   
                        create index IX_LEDGERACCOUNT_DATAELEMENT'+convert(nvarchar(2),@SEGMENTCOLUMN)+'ID_DYN on dbo.LEDGERACCOUNT (DATAELEMENT'+convert(nvarchar(2),@SEGMENTCOLUMN)+'ID)'
                    exec (@SQL)                
                    fetch next from Cur into @SegmentColumn
                    end
                close cur
                deallocate cur

                select @Columns = (select top 15 'DATAELEMENT'+convert(nvarchar(2),SEGMENTCOLUMN)+'ID,'
                    from dbo.ACCOUNTSTRUCTURE
              where ELEMENTTYPECODE = 1
                    order by SEGMENTCOLUMN
                    for xml path(''))

                set @SQL = 'CREATE NONCLUSTERED INDEX [IX_LEDGERACCOUNT_DATAELEMENTS_DYN] ON [dbo].[LEDGERACCOUNT] 
              ('+substring(@Columns,1,len(@Columns)-1)+')'

                  if exists (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.LEDGERACCOUNT') AND name = N'IX_LEDGERACCOUNT_DATAELEMENTS_DYN')
                      set @SQL = @SQL+' with (DROP_EXISTING=ON)'

            exec (@SQL)

                if (select count(*) from dbo.ACCOUNTSTRUCTURE where ELEMENTTYPECODE = 1) > 15
                    begin
                    select @Columns = (select top 15 'DATAELEMENT'+convert(nvarchar(2),SEGMENTCOLUMN)+'ID,'
                      from accountstructure
                      where SEGMENTCOLUMN > (select max(SEGMENTCOLUMN) from (select top 15 SEGMENTCOLUMN from dbo.ACCOUNTSTRUCTURE where ELEMENTTYPECODE = 1) V1)
                      order by SEGMENTCOLUMN
                      for xml path(''))

                  set @SQL = 'CREATE NONCLUSTERED INDEX [IX_LEDGERACCOUNT_DATAELEMENTS_ADDITIONAL_DYN] ON [dbo].[LEDGERACCOUNT] 
                      ('+substring(@Columns,1,len(@Columns)-1)+')
                      INCLUDE (ACCOUNTSTRING,ID)'

                    if exists (SELECT * FROM sys.indexes WHERE object_id = OBJECT_ID(N'dbo.LEDGERACCOUNT') AND name = N'IX_LEDGERACCOUNT_DATAELEMENTS_ADDITIONAL_DYN')
                        set @SQL = @SQL+' with (DROP_EXISTING=ON)'

                    exec (@SQL)

                    end

                end