Создайте функцию в t- SQL, которая будет автоматически выбирать исходную и целевую таблицы и обновлять значения в указанных столбцах c - PullRequest
0 голосов
/ 21 апреля 2020

У меня есть таблица, предположим, [dbo]. [Anonymised_Data], которая содержит информацию о целевой таблице, в которой необходимо изменить определенные значения. Имена столбцов также указаны в таблице. ´

+--------------+--------------+----------------+---------------+
| Target_table |  Column_Name | Original_Value | Masked_Value  |
+--------------+--------------+----------------+---------------+
| Table 1      | 0RT01        |  Dhaka         | City 1        |
| Table 1      | NAME1        |  P&G           | Vendor 1      |
+--------------+--------------+----------------+---------------+

Теперь я хочу создать функцию, которая изменит значения в этих столбцах целевой таблицы с исходного значения на маскированное значение. Я также хочу, чтобы функция могла возвращать маскированное значение к исходному значению.

Таким образом, результат будет выглядеть, например: Ранее

Table 1
+-------------------+
| ORT01 | Client    | 
+-------------------+
| Dhaka |     A     |
+-------------------+         

И после запуска функции он будет выглядеть так:

Table 1
+-------------------+
| ORT01  | Client    | 
+-------------------+
| City 1 |     A     |
+-------------------+         

То есть все другие значения в целевой таблице остаются прежними. Я также хочу, чтобы опция вернулась к исходным значениям.

Я понимаю, что это может быть достигнуто с помощью большего количества временных таблиц, но [dbo]. [Anonymised_Data] будет содержать ссылку на большое количество таблиц и, следовательно, обновление каждый по одному был бы утомительным.

Если бы кто-нибудь мог предложить решение, было бы здорово! Спасибо.

1 Ответ

1 голос
/ 21 апреля 2020

Единственный способ думать об этом - использовать динамически генерируемые операторы SQL

DECLARE @rollBack BIT = 0 --SET TO 1 TO ROLLBACK TO UNMASKED VALUES


DECLARE @updateStatements TABLE
(
    ID INT IDENTITY(1,1) NOT NULL
    ,UpdateStatement NVARCHAR(MAX)
)

;with statements
AS
(
    SELECT *
    ,QUOTENAME(Column_Name) + ' = ''' + CASE @rollBack WHEN 1 THEN Original_Value ELSE Masked_Value END + '''' as SetStatement
    ,'WHERE ' + QUOTENAME(Column_Name) + ' = ''' + CASE @rollBack WHEN 1 THEN Masked_Value ELSE Original_Value END + '''' as WhereClause
    ,ROW_NUMBER() OVER (ORDER BY Target_Table, Column_Name) as PID
    FROM Anonymised_Data
)


INSERT INTO @updateStatements
(
    UpdateStatement
)
SELECT
'UPDATE ' + QUOTENAME(Target_Table) + ' SET ' + SetStatement + ' ' + WhereClause as UpdateStatement
FROM statements


DECLARE @curID INT = 1
DECLARE @maxID INT = (SELECT MAX(ID) FROM @updateStatements)


WHILE (@curID <= @maxID)
BEGIN
    DECLARE @curStatement NVARCHAR(MAX) = N''
    SELECT @curStatement = UpdateStatement
    FROM @updateStatements
    WHERE ID = @curID

    PRINT @curStatement
    EXEC (@curStatement)

    SET @curID += 1
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...