# [26ai] Mandatory Profile

*El artículo también se encuentra publicado en Ingles* [***English version***](https://dbaintheshadow.com/26ai-mandatory-profile)*.*

En este pequeño artículo vamos a ver los **Mandatory Profile**.

Aunque no es una novedad en **26ai**, sino que fue en la **21c**, vamos a proceder a configurarlo en la última release de Oracle.

Este tipo de **Profile** pueden ser creados dentro de *CDB$Root* para luego asignarse a las distintas *PDBs*. Otro punto a tener en cuenta, es que si necesitamos modificarlos, debemos realizarlo a nivel de CDB$ROOT, **no** de PDB, usando **common users**, no **local users**.

Además, las políticas definidas en el **Profile** se aplicarán a todos los usuarios de la PDB.

¿Qué parámetros puedo usar? A diferencia de un **Profile**, donde tenemos multitud de parámetros para configurar, aquí solo podemos definir dos, son:

* **Password\_verify\_function** para forzar la complejidad de la contraseña por medio de la función que tenga asignada. Valor por defecto es *null*.
    
* **Password\_grace\_time** permite especificar un periodo de gracia para aquellas cuentas que violen la complejidad de las contraseñas. Valor por defecto es *0*.
    

Lo primero que vamos hacer es definir la función que asignaremos al parámetro **password\_verify\_function.**

```sql
SQL> 
CREATE OR REPLACE FUNCTION VALIDATION_BUSINESS(username     varchar2,
                                               password     varchar2,
                                               old_password varchar2)
  return boolean IS
BEGIN
  if not ora_complexity_check(password, chars => 8, digit => 4) then
    return(false);
  end if;
  return(true);
END;
/
Function created.
```

Cómo podemos ver, estoy definiendo la función **VALIDATION\_BUSINESS** dentro de CDB$Root con el objetivo de que todas las contraseñas de los usuarios tengan al menos una longitud de 8 caracteres “*chars =&gt; 8*” y 4 dígitos “*digit=&gt;4*“.

Definimos el **Mandatory Profile** usando los siguientes parámetros:

* *PASSWORD\_VERIFY\_FUNCTION* para asignarle la función que hemos creado en el punto anterior.
    
* *PASSWORD\_GRACE\_TIME* para dar al usuario un periodo de gracia de 5 días para cambiar la contraseña.
    

```sql
SQL> 
  CREATE MANDATORY PROFILE C##VALIDATION_BUSINESS 
   LIMIT 
     PASSWORD_VERIFY_FUNCTION VALIDATION_BUSINESS 
     PASSWORD_GRACE_TIME 5 
   CONTAINER = ALL; 

Profile created.
```

Como último paso sería modificar el parámetro **MANDATORY\_USER\_PROFILE**.

Aquí podemos hacer dos cosas, si queremos que el cambio afecte a todas las PDB, debemos ajustar ese parámetro a nivel de CDB$ROOT; pero si queremos que solo se aplique a una PDB específica, entonces debemos modificarlo directamente dentro de esa PDB.

```sql
SQL> show parameter MANDATORY_USER_PROFILE
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
mandatory_user_profile               string

SQL> ALTER SYSTEM SET MANDATORY_USER_PROFILE=C##VALIDATION_BUSINESS;
System altered.

SQL> show parameter MANDATORY_USER_PROFILE

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
mandatory_user_profile               string      C##VALIDATION_BUSINESS
```

Espero que os guste. ¡Nos vemos en el próximo artículo!
