USP_GLOBALCHANGE_RIGHTTOBEFORGOTTEN_REMOVEAUDITDATA

Parameters

Parameter Parameter Type Mode Description
@CHANGEAGENTID uniqueidentifier IN
@ASOF datetime IN
@NUMBERADDED int INOUT
@NUMBEREDITED int INOUT
@NUMBERDELETED int INOUT
@IDSETREGISTERID uniqueidentifier IN
@PURGEACTIVE bit IN
@CURRENTAPPUSERID uniqueidentifier IN

Definition

Copy


CREATE procedure dbo.USP_GLOBALCHANGE_RIGHTTOBEFORGOTTEN_REMOVEAUDITDATA
(
  @CHANGEAGENTID uniqueidentifier = null,
  @ASOF as datetime = null,
  @NUMBERADDED int output,
  @NUMBEREDITED int output,
  @NUMBERDELETED int output,
  @IDSETREGISTERID uniqueidentifier,
  @PURGEACTIVE bit,
  @CURRENTAPPUSERID uniqueidentifier
)
as
set nocount off;

declare @CURRENTDATE datetime;
set @CURRENTDATE = getdate();
set @NUMBERADDED = 0;
set @NUMBEREDITED = 0;
set @NUMBERDELETED = 0

declare @BPID uniqueidentifier = '3269A1D1-31CB-4D28-945C-B7623A3EFCCA';
declare @BYPASSSECURITY bit;
declare @BYPASSSITESECURITY bit;                
declare @USERHASSITEACCESS bit;
declare @SITEID uniqueidentifier;

exec dbo.USP_SECURITY_APPUSER_BYPASSSECURITYFORBUSINESSPROCESS @CURRENTAPPUSERID, @BPID, @BYPASSSECURITY output, @BYPASSSITESECURITY output;                

-- If the user should not bypass security and does not have rights, exit the procedure.

if @BYPASSSECURITY = 0 and @BYPASSSITESECURITY = 0
  return 0;

if @CHANGEAGENTID is null
  exec dbo.USP_CHANGEAGENT_GETORCREATECHANGEAGENT @CHANGEAGENTID output;

-- this cannot be a @table as it will out of scope of the sql strings sent to sp_executesql

create table #SELECTION
(
  ID uniqueidentifier not null primary key
);

declare @WORKING table 
(
  PKTABLE_QUALIFIER sysname,
  PKTABLE_OWNER sysname,
  PKTABLE_NAME sysname,
  PKCOLUMN_NAME sysname,
  FKTABLE_QUALIFIER sysname,
  FKTABLE_OWNER sysname,
  FKTABLE_NAME sysname,
  FKCOLUMN_NAME sysname,
  KEY_SEQ smallint,
  UPDATE_RULE smallint,
  DELETE_RULE smallint,
  FK_NAME sysname,
  PK_NAME sysname,
  DEFERRABILITY smallint
);

declare @AUDITTODELETE table
(
  ID int IDENTITY(1,1),
  TABLENAME nvarchar(255),
  AUDITENABLED bit,
  FKTABLE_NAME sysname,
  FKCOLUMN_NAME sysname,
    DELETESQL nvarchar(500)
);

-- hold state of audit on / not on

declare @AUDITTABLEON table
(
  ID int IDENTITY(1,1),
  TABLENAME nvarchar(255),
  AUDITENABLED bit
);

begin try

insert into #SELECTION(ID)
select ID from dbo.UFN_CONSTITUENT_GETRECORDSINSELECTION_FORBUSINESSPROCESS(@CURRENTAPPUSERID, @IDSETREGISTERID, @BPID, @BYPASSSECURITY, @BYPASSSITESECURITY);

declare @FULLDELETE nvarchar(max);

-- get list of table to delete from

INSERT INTO @AUDITTABLEON (TABLENAME, AUDITENABLED)
exec dbo.USP_AUDIT_AUDITTABLELIST null, @PURGEACTIVE;

-- lets get FK's for dbo.CONSTITUENT.ID

INSERT INTO @WORKING
EXEC sp_fkeys 'CONSTITUENT';

-- these tables don't have audit, remove them

delete 
from    @WORKING
where    FKTABLE_NAME like 'SMARTFIELD%'
OR        FKTABLE_NAME like 'RE7MAP%';

-- create working table to run the deletes

-- account for when the FK is the table PK as well i.e. its called ID in the dependant table

-- ALWAYS delete from the CONSTITUENTAUDIT table (the union)

insert into @AUDITTODELETE (TABLENAME, AUDITENABLED, FKTABLE_NAME, FKCOLUMN_NAME)
select  TABLENAME + 'AUDIT', AUDITENABLED, FKTABLE_NAME + 'AUDIT',
        case 
                when FKCOLUMN_NAME = 'ID' then 'AUDITRECORDID'
                else FKCOLUMN_NAME
            end FKCOLUMN_NAME
from    @AUDITTABLEON a,
        @WORKING w
where   a.TABLENAME = w.FKTABLE_NAME

union all

select    'CONSTITUENTAUDIT',1,'CONSTITUENTAUDIT','AUDITRECORDID';

-- create the table specific delete sql

update    @AUDITTODELETE
set        DELETESQL = 'delete tbl from dbo.' + TABLENAME + ' tbl inner join #SELECTION s on s.ID = tbl.' + FKCOLUMN_NAME + ';';

-- concat the deletes into one statement

select @FULLDELETE = STUFF((select ' ' + DELETESQL from @AUDITTODELETE for xml path('')), 1 , 1 , '');

begin tran

  -- exec the deletes

  exec sp_executesql @FULLDELETE;

  if @@ERROR <> 0
    rollback tran;

  -- set number worked on

  select    @NUMBERDELETED = COUNT(*) from @AUDITTODELETE;
  select    @NUMBEREDITED = 0;
  select    @NUMBERADDED = 0;

if @@ERROR <> 0
  rollback tran;
else
  commit tran;

drop table #SELECTION;

end try

begin catch
    exec dbo.USP_RAISE_ERROR;
    return 1;
end catch