You are on page 1of 6

USE [URD_PRUD_db]

GO
/****** Object: StoredProcedure [dbo].[TransferJasperChanges_PRUD] Script Date:
6/3/2019 3:04:22 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER Procedure [dbo].[TransferJasperChanges_PRUD] @IsInitialLoad int, @TenantName


nvarchar(128)
AS
DECLARE @TenantId int
Select @TenantId = Cast(Id as int) From dbo.JITenant Where tenantId =
@TenantName

/*
--Drop Temp Tables when Debugging
IF OBJECT_ID('tempdb..#DeletedJIRoles') IS NOT NULL
DROP TABLE #DeletedJIRoles

IF OBJECT_ID('tempdb..#DeletedJIUsers') IS NOT NULL


DROP TABLE #DeletedJIUsers

IF OBJECT_ID('tempdb..#DeletedJIReportJobs') IS NOT NULL


DROP TABLE #DeletedJIReportJobs
*/

--Delete default users role mapping


Delete JIUR
From dbo.JIUserRole JIUR
INNER JOIN dbo.JIUser JIU
ON JIU.Id = JIUR.userId
AND JIU.username in ('jasperadmin','joeuser','dummyPRUD')
AND JIU.tenantId = @TenantId

/* Updating the tenantId value from NULL with the proper tenantId. We added
TenantId column in JIUserRole, hence while updating
the password this value becomes null */
Update JIUR
Set tenantId = @TenantId
From dbo.JIUserRole JIUR
INNER JOIN dbo.JIUser JIU
ON JIUR.userId = JIU.id
AND JIU.tenantId = @TenantId --Required so only current tenants records
are modified
Where JIUR.tenantId IS NULL

/****************************************************************************
***********/
/****************************** Process JIRole Changes
******************************/
/****************************************************************************
***********/
Declare @TenantPath varchar(500) = 'repo:/organizations/'+ @TenantName +'/%'
Create Table #DeletedJIRoles (JIRoleId int)
IF (@IsInitialLoad = 1)
BEGIN
/* Insert all Roles in the JIRole table not in JIRole Stage */
Insert Into #DeletedJIRoles (JIRoleId)
Select JIR.id
From dbo.JIRole JIR
LEFT JOIN dbo.[JIRole_PRUD] JIRS ON JIRS.rolename = JIR.rolename
Where JIR.tenantId = @TenantId
AND JIRS.rolename IS NULL
AND (JIR.rolename Like 'Aud_%'
OR JIR.rolename Like 'Sec_%'
)
END
ELSE
BEGIN
/* Inserts all Roles deleted from JIRole Stage */
Insert Into #DeletedJIRoles (JIRoleId)
Select JIR.id
From dbo.JIRole JIR
INNER JOIN dbo.[JIRole_PRUD] JIRS
ON JIRS.rolename collate database_default= JIR.rolename
AND JIRS.Operation = 1
Where JIR.tenantId = @TenantId
END

/* Delete records in the JIUserRole table for Roles that have been removed,
no tenant required as Ids are tenant specific */
Delete JIUR
From dbo.JIUserRole JIUR
INNER JOIN #DeletedJIRoles DJIR ON DJIR.JIRoleId = JIUR.roleId

/* Delete records in the JIObjectPermission for Roles that have been removed
*/
Delete JIOP
From dbo.JIObjectPermission JIOP
INNER JOIN #DeletedJIRoles DJIR ON DJIR.JIRoleId = JIOP.recipientobjectid
Where recipientobjectclass =
'com.jaspersoft.jasperserver.api.metadata.user.domain.impl.hibernate.RepoRole'
AND uri+'/' like @TenantPath

/* Removes all records from JIRole that no longer exist, no tenant required
as Ids are tenant specific */
Delete JIR
From dbo.JIRole JIR
INNER JOIN #DeletedJIRoles DJIR ON DJIR.JIRoleId = JIR.Id

/* Insert records from JIRole Stage that don't exist in JIRole */


Insert Into dbo.JIRole (rolename, tenantId, externallyDefined, rmroleid)
Select JIRS.rolename
,JIRS.tenantId
,JIRS.externallyDefined
,JIRS.rmroleid
From dbo.[JIRole_PRUD] JIRS
LEFT JOIN dbo.JIRole JIR
ON JIRS.rolename collate database_default= JIR.rolename
AND JIR.tenantId = @TenantId
Where JIRS.Operation = 2
AND JIR.id IS NULL
/****************************************************************************
***********/
/****************************** Process JIUser Changes
******************************/
/****************************************************************************
***********/

/* Deletes Records in the JIUser table not in JIUser Stage during initial ETL
runs */
Create Table #DeletedJIUsers (JIUserId int)
Create Table #DeletedJIReportJobs (JIJobId int)

IF (@IsInitialLoad = 1)
BEGIN
/* Insert all Users in the JIUser table not in JIUser Stage */
Insert Into #DeletedJIUsers (JIUserId)
Select JIU.id
From dbo.JIUser JIU
LEFT JOIN dbo.[JIUser_PRUD] JIUS ON JIUS.ReportingUserId collate
database_default= JIU.ReportingUserId
Where JIU.tenantId = @TenantId
AND JIUS.ReportingUserId IS NULL
END
ELSE
BEGIN
/* Inserts all Users deleted from JIUser Stage */
Insert Into #DeletedJIUsers (JIUserId)
Select JIU.id
From dbo.JIUser JIU
INNER JOIN dbo.[JIUser_PRUD] JIUS
ON JIUS.ReportingUserId collate database_default=
JIU.ReportingUserId
AND JIUS.Operation = 1
Where JIU.tenantId = @TenantId
END

/* Deletes all Access Events associated with Deleted Users */


Delete JAE
From dbo.JIAccessEvent JAE
INNER JOIN #DeletedJIUsers DJRJ ON DJRJ.JIUserId = JAE.user_Id

/* Deletes all reports associated with deleted users */


Insert Into #DeletedJIReportJobs(JIJobId)
Select RJ.id
From dbo.JIReportJob RJ
INNER JOIN #DeletedJIUsers DJIU ON RJ.owner = DJIU.JIUserId
WHERE RJ.report_unit_uri+'/' like @tenantPath

Delete RJP
From dbo.JIReportJobParameter RJP
INNER JOIN #DeletedJIReportJobs DJRJ ON DJRJ.JIJobId = RJP.job_id

Delete RJOF
From dbo.JIReportJobOutputFormat RJOF
INNER JOIN #DeletedJIReportJobs DJRJ ON DJRJ.JIJobId = RJOF.report_job_id

Delete RJ
From dbo.JIReportJob RJ
INNER JOIN #DeletedJIReportJobs DJRJ ON DJRJ.JIJobId = RJ.id

/* Delete records in the JIObjectPermission for Users that have been removed
*/
Delete JOP
From dbo.JIObjectPermission JOP
INNER JOIN #DeletedJIUsers DJRJ ON DJRJ.JIUserId = JOP.recipientobjectid
Where recipientobjectclass =
'com.jaspersoft.jasperserver.api.metadata.user.domain.impl.hibernate.RepoUser'
AND uri+'/' LIKE @tenantPath

/* Delete records in the JIUserRole table for Users that have been removed,
no tenant required as Ids are tenant specific */
Delete JIUR
From dbo.JIUserRole JIUR
INNER JOIN #DeletedJIUsers DJIU ON DJIU.JIUserId = JIUR.userId

/* Delete records in the JIProfileAttribute table for Users that have been
removed, no tenant required as Ids are tenant specific */
Delete JIPA
From dbo.JIProfileAttribute JIPA
INNER JOIN #DeletedJIUsers DJIU ON DJIU.JIUserId = JIPA.principalobjectid

/* Removes all records from JIUser that no longer exist, no tenant required
as Ids are tenant specific */
Delete JIU
From dbo.JIUser JIU
INNER JOIN #DeletedJIUsers DJIU ON DJIU.JIUserId = JIU.id

/* Update records in JIUser that exist in JIUser Stage */


Update JIU
Set fullname = JIUS.fullname
,username = JIUS.username
,password = JIUS.password
From dbo.JIUser JIU
INNER JOIN dbo.[JIUser_PRUD] JIUS
ON JIUS.ReportingUserId collate database_default= JIU.ReportingUserId
AND JIUS.Operation in (2,4)
Where JIU.tenantId = @TenantId

/* Insert records from JIUser Stage that don't exist in JIUser */


Insert Into dbo.JIUser (
emailAddress, enabled, externallyDefined, fullname, password,
previousPasswordChangeTime, ReportingUserId, tenantId, username)
Select JIUS.emailAddress
,JIUS.enabled
,JIUS.externallyDefined
,JIUS.fullname
,JIUS.password
,JIUS.previousPasswordChangeTime
,JIUS.ReportingUserId
,JIUS.tenantId
,JIUS.username
From dbo.[JIUser_PRUD] JIUS
LEFT JOIN dbo.JIUser JIU
ON JIUS.ReportingUserId collate database_default= JIU.ReportingUserId
AND JIU.tenantId = @TenantId
Where JIUS.Operation in (2,4)
AND JIU.id IS NULL

/****************************************************************************
***********/
/************************ Process JIProfileAttribute Changes
************************/
/****************************************************************************
***********/

/* Deletes all records in the JIProfileAttribute table during initial ETL


runs */
IF (@IsInitialLoad = 1)
BEGIN
Delete From dbo.JIProfileAttribute Where tenantId = @TenantId
END

/* Removes all attributes from JIProfileAttribute deleted from Stage */


Delete JIPA
From dbo.JIProfileAttribute JIPA
INNER JOIN dbo.JIUser JIU ON JIU.id = JIPA.principalobjectid
INNER JOIN dbo.[JIProfileAttribute_PRUD] JIPAS
ON JIPAS.tenantId = JIPA.tenantId
AND JIPAS.principalobjectusername collate database_default=
JIU.username
AND JIPAS.Operation in (1,2)

/* Insert records from JIProfileAttribute Stage that don't exist in


JIProfileAttribute */
Insert Into dbo.JIProfileAttribute (attrName, attrValue,
principalobjectclass, principalobjectid, tenantId)
Select JIPAS.attrName
,JIPAS.attrValue
,JIPAS.principalobjectclass
,JIU.id
,JIPAS.tenantId
From dbo.[JIProfileAttribute_PRUD] JIPAS
INNER JOIN dbo.JIUser JIU
ON JIU.username collate database_default= JIPAS.principalobjectusername
AND JIU.tenantId = JIPAS.tenantId
Where JIPAS.Operation = 2

/* Update records from JIProfileAttribute Stage that have changed */


Update JIPA
Set attrValue = JIPAS.attrValue
From dbo.JIProfileAttribute JIPA
INNER JOIN dbo.JIUser JIU ON JIU.id = JIPA.principalobjectid
INNER JOIN dbo.[JIProfileAttribute_PRUD] JIPAS
ON JIPAS.tenantId = JIPA.tenantId
AND JIPAS.principalobjectusername collate database_default=
JIU.username
AND JIPAS.attrName collate database_default= JIPA.attrName
AND JIPAS.Operation = 4

/****************************************************************************
***********/
/**************************** Process JIUserRole Changes
****************************/
/****************************************************************************
***********/
/* Delete all records from JIUserRole when initial and only deleted records
when incremental */
IF (@IsInitialLoad = 1)
DELETE FROM dbo.JIUserRole WHERE tenantId = @TenantId
ELSE
DELETE FROM JIUR
FROM dbo.JIUserRole JIUR
INNER JOIN dbo.JIUser JIU
ON JIU.id = JIUR.UserId
AND JIU.tenantId = @TenantId
INNER JOIN JIUserRole_PRUD JIURS
ON JIURS.ReportingUserId = JIU.ReportingUserId
AND JIURS.Operation = 1
WHERE JIUR.tenantId = @TenantId

/* Insert all new records into JIUserRole */


INSERT INTO dbo.JIUserRole (userId, roleId, tenantId)
SELECT JIU.id
,JIR.id
,@TenantId
From [JIUserRole_PRUD] JIURS
INNER JOIN dbo.JIUser JIU
ON JIU.ReportingUserId = JIURS.ReportingUserId
AND JIU.tenantId = @TenantId
INNER JOIN dbo.JIRole JIR
ON JIR.rolename = JIURS.rolename
AND JIR.tenantId IN (1,@TenantId)
WHERE JIURS.Operation = 2
ORDER BY JIU.id ASC, JIR.id ASC

You might also like