Tengo varias tablas como EMPLOYEE, EMPLOYEEMail y más tablas. Para fines de referencia, estoy poniendo algunos datos de muestra y 2 tablas
CREATE TABLE EMPLOYEE ( empId INTEGER PRIMARY KEY, name TEXT NOT NULL, dept TEXT NOT NULL, phone bigint ); INSERT INTO EMPLOYEE VALUES (0001, 'Clark', 'Sales',9001234567); INSERT INTO EMPLOYEE VALUES (0002, 'Dave', 'Accounting',9000123456); INSERT INTO EMPLOYEE VALUES (0003, 'Ava', 'Sales',9000012345); CREATE TABLE EMPLOYEEMail ( empId INTEGER PRIMARY KEY, MailID TEXT NOT NULL, AlternateMail TEXT NOT NULL ); INSERT INTO EMPLOYEEMail VALUES (0001, 'hello123@gmail.com','hi123@gmail.com'); INSERT INTO EMPLOYEEMail VALUES (0002, 'good123@gmail.com','bye123@gmail.com'); INSERT INTO EMPLOYEEMail VALUES (0003, 'super123@gmail.com','fast123@gmail.com');Consulta :
SELECT CONCAT(SUBSTR(phone, 1, 6), REPEAT('*', CHAR_LENGTH(phone) - 6)) AS masked_phone FROM `EMPLOYEE`; select CONCAT(LEFT(UUID(), 8), '@', SUBSTRING_INDEX(`MailID`, '@', -1)) as phone, CONCAT(LEFT(UUID(), 8), '@', SUBSTRING_INDEX(`AlternateMail`, '@', -1)) as AlternateMail from EMPLOYEEMail;Producción:
teléfono_enmascarado
900123**** 900012**** 900001****teléfono Correo alternativo
d8883d67@gmail.com d8883d92@gmail.com d8883dd0@gmail.com d8883dde@gmail.com d8883df3@gmail.com d8883dff@gmail.comEstá funcionando bien hasta seleccionar la consulta, pero necesito enmascarar varias columnas, todas vendrán en valores separados por comas como este
(MailID ,AlternateMail,Phone,SSN,BankAccount,Addrress)Estoy buscando una declaración de bucle donde compararé estos valores con la tabla Information_schema.columns, cualquiera que sea la columna que coincida con los valores dados.
Estoy tratando de incluirlos en la declaración de selección dinámica con @column y @tablename y cargar los valores enmascarados en la tabla temporal. Por favor sugiérame en esto.
Creo que la subcadena es más bonita que enmascarar direcciones de correo electrónico y, de esta manera, los datos confidenciales permanecerán en secreto.
SELECT CONCAT("****", SUBSTRING(`EMPLOYEEMail`.`MailID`, LOCATE('@', `EMPLOYEEMail`.`MailID`) - 4 )) AS MailID, CONCAT("****", SUBSTRING(`EMPLOYEEMail`.`AlternateMail`, LOCATE('@', `EMPLOYEEMail`.`AlternateMail`) - 4 )) AS AlternateMail, INSERT(`EMPLOYEE`.`phone`,7,10,"****") as masked_phone FROM EMPLOYEE JOIN EMPLOYEEMail ON EMPLOYEE.empId=EMPLOYEEMail.empId;Con su solución (completamente enmascarado el nombre de usuario de las direcciones de correo electrónico), la consulta pierde sentido porque nada se refiere a los datos originales.
¿Por qué no usas el concepto de Vista para lograr esto?. Uno de los beneficios de Views es ocultar información específica de la tabla original o visualizarla de otra manera, sin tocar los datos originales.
En su caso, solo necesita crear una vista con la consulta anterior para ocultar la parte específica del número de teléfono, correo electrónico, etc.
CREATE VIEW employee_info_encrypted AS SELECT CONCAT(SUBSTR(phone, 1, 6), REPEAT('*', CHAR_LENGTH(phone) - 6)) AS masked_phone, CONCAT(LEFT(UUID(), 8), '@', SUBSTRING_INDEX(`MailID`, '@', -1)) as phone, CONCAT(LEFT(UUID(), 8), '@', SUBSTRING_INDEX(`AlternateMail`, '@', -1)) as AlternateMail FROM `EMPLOYEE` inner join EMPLOYEEMail on EMPLOYEEMail.empId = EMPLOYEE.empId;Luego, al ejecutar la siguiente consulta, obtendrá la información enmascarada:
select * from employee_info_encrypted;Cada vez que desee agregar una nueva columna, por ejemplo, a la respuesta, simplemente cambie el código Ver y cambiará la respuesta según las nuevas condiciones.