Berechtigungsobjekte per Programm aus allen Rollen entfernen

Gelegentlich kommt es vor, dass Sie ein Berechtigungsobjekt aus allen Rollen / oder bestimmten Rollen entfernen wollen und müssen. Sei es weil das Objekt nicht mehr verwendet wird, oder Sie das Berechtigungsobjekt in den Feldern anpassen wollen und die nicht funktioniert, solange es noch in Rollen enthalten ist.

Dies kann natürlich manuell über die Transaktion PFCG erfolgen. Sind es jedoch viele  Rollen erfolgt dies besser per Programm. Das folgende Coding kann hier als Ausgangspunkt verwendet werden. Für einen produktiven Einsatz sollte die natürlich noch um Prüfungen erweitert werden.


DATA: lt_values  LIKE  TABLE OF pt1251,
      ls_values  LIKE           pt1251,
      lt_auth    LIKE  TABLE OF pt1250,
      ls_auth    LIKE           pt1250.

PARAMETERS: pa_role TYPE agr_name DEFAULT 'NAME_ROLLE',
            pa_obj  TYPE agobject DEFAULT 'PLOG'.

**********************************************************************
** lesen der Berechtigungsobjekte in der Rolle
CALL FUNCTION 'PRGN_1251_READ_FIELD_VALUES'
  EXPORTING
    activity_group    = pa_role
  TABLES
    field_values      = lt_values
  EXCEPTIONS
    no_data_available = 1.

**********************************************************************
** entfernen des gewünschten Berechtigungsobjektes
LOOP AT lt_values INTO ls_values.
  IF ls_values-object = pa_obj.
    DELETE lt_values INDEX sy-tabix.
  ENDIF.
ENDLOOP.

**********************************************************************
** sichern der aktualisierten Werte
CALL FUNCTION 'PRGN_1251_SAVE_FIELD_VALUES'
  EXPORTING
    activity_group = pa_role
  TABLES
    field_values   = lt_values.

**********************************************************************
** jetzt noch die Tabelle mit den in der Rolle enthaltenen Objekten lesen
CALL FUNCTION 'PRGN_1250_READ_AUTH_DATA'
  EXPORTING
    activity_group    = pa_role
  TABLES
    auth_data         = lt_auth
  EXCEPTIONS
    no_data_available = 1.

**********************************************************************
** und auch hier das Objekt entfernen
LOOP AT lt_auth INTO ls_auth.
  IF ls_auth-object = pa_obj.
    DELETE lt_auth INDEX sy-tabix.
  ENDIF.
ENDLOOP.

**********************************************************************
** und die Änderungen wieder sichern
CALL FUNCTION 'PRGN_1250_SAVE_AUTH_DATA'
  EXPORTING
    activity_group = pa_role
  TABLES
    auth_data      = lt_auth.

**********************************************************************
** Datenbank-Update und Puffer
CALL FUNCTION 'PRGN_UPDATE_DATABASE'.
CALL FUNCTION 'PRGN_CLEAR_BUFFER'.

* Setting COLL_AGR flag
CALL FUNCTION 'PRGN_SET_COLLECTIVE_AGR_FLAG'
  EXPORTING
    activity_group      = pa_role
    collective_agr_flag = space.

**********************************************************************
** und jetzt noch das Profil generieren
CALL FUNCTION 'SUPRN_PROFILE_BATCH'
  EXPORTING
    act_objid             = pa_role
  EXCEPTIONS
    objid_not_found       = 1
    no_authorization      = 2
    generation_not_active = 3
    empty_authorizations  = 4
    enqueue_failed        = 5
    not_generated         = 6
    value_overflow        = 7.