Маскрировка кредитной карты в sql с помощью REGEXP_REPLACE
Уважаемые! Просьба помочь разобраться! Я в ИТ не так давно, есть сложности с регулярками.
Есть таблица Cards, в которой присутствуют номера кредитных карт. Хочу выполнить маскировку номера карт (оставить первые 6 и последние 4 цифры, остальное замаскировать под "X")
Ничего лучше REGEXP_REPLACE не идет в голову. Можете подсказать, какую регулярку использовать в REGEXP_REPLACE, чтобы получить желаемый номер карты, например 456234XXXXXX2342
Пробовал что то типо такого:
SELECT REGEXP_REPLACE (Card_Number,'7,8,9,10,11,12', '\d', 'X') FROM cards -- но выводит не то, что хочется
Также наткнулся на пакет DBMS_REDACT.ADD_POLICY, с помощью которого можно замаскировать номер, но моя БД его не видит. Создал табличку по примеру:
CREATE TABLE CLIENT_INFO
(
ID NUMBER,
F_NAME VARCHAR2(64), /* фамилия*/
NAME VARCHAR2(64), /* имя */
S_NAME VARCHAR2(64), /* отчество */
BIRTHDAY DATE, /* дата рождения */
PHONE VARCHAR2(32), /* телефон */
EMAIL VARCHAR2(64), /* email */
CCARD VARCHAR2(32), /* номер кредитной карты */
CONSTRAINT "CLIENT_INFO_PK" PRIMARY KEY ("ID")
);
Пытаюсь добавить политику:
BEGIN
DBMS_REDACT.ADD_POLICY(
object_schema => 'STUDENT_PROKUDIN',
object_name => 'CLIENT_INFO',
column_name => 'BIRTHDAY',
policy_name => 'redact_client_info',
function_type => DBMS_REDACT.PARTIAL, /* Частичное маскирование */
function_parameters => 'Md01Y', /* Маска изменений */
expression => 'SYS_CONTEXT(''SYS_SESSION_ROLES'',''R_VIP'') = ''FALSE''' /* Условие - замена при отсутствии роли R_VIP */
);
END;
но выходит ошибка
SQL Error [6550] [65000]: ORA-06550: Строка 7, столбец 30:
PLS-00201: идентификатор 'DBMS_REDACT' должен быть объявлен
ORA-06550: Строка 2, столбец 1:
PL/SQL: Statement ignored
Ответы (1 шт):
Вот что вам нужно:
SELECT regexp_replace(Card_Number,'(.){6}','XXXXXX', 7) from A;
Как это устроено:
Точка в регулярном выражении — любой символ.
{6} - сколько раз повторяется.
ХХХХХХ - на что меняем.
7 - с какого символа замена.
Синтаксис в общем виде:
REGEXP_REPLACE( string, pattern [, replacement_string [, start_position [, nth_appearance [, match_parameter ] ] ] ] )
Общий совет:
Не "прыгайте" между идеями, усложняя себе задачу. Взяли тему - и "копайте". Сначала синтаксис внимательно прочитайте, потом ищите поисковиком примеры похожие, если чтения синтаксиса не хватило, чтобы заработало. И проверяйте на быстрой простой базе, что получается. Я, например, регулярки и не знаю толком и не люблю, но вот накопал довольно быстро, раз помочь надо:-)
Проверка в mySQL:
CREATE TABLE A(
id INT PRIMARY KEY AUTO_INCREMENT,
Card_Number VARCHAR(16)
);
INSERT INTO A (Card_Number)
VALUES
('1234567890123456'),
('2345678901234567');
SELECT regexp_replace(Card_Number,'(.){6}','XXXXXX', 7) from A;
Результат:
Query result:
+--------------------------------------------------+
| regexp_replace(Card_Number,'(.){6}','XXXXXX', 7) |
+--------------------------------------------------+
| 123456XXXXXX3456 |
| 234567XXXXXX4567 |
+--------------------------------------------------+
Affected rows: 2
Полезные ссылки по данному вопросу:
Общий синтаксис: https://oracleplsql.ru/regexp_replace-function.html
Похожие примеры: http://kodesource.top/oracle/character-functions/oracle-regexp_replace-function.php