Можно ли изменить столбцы, сопоставив их с другой существующей временной таблицей?

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

IF EXISTS(SELECT *
          FROM INFORMATION_SCHEMA.COLUMNS
          WHERE TABLE_NAME = 'TableName' and 
          COLUMN_NAME = 'BirthDate' OR COLUMN_NAME = 'EmailAddress' OR COLUMN_NAME = 'FirstName' OR COLUMN_NAME = 'LastName' OR COLUMN_NAME = 'MiddleName' OR COLUMN_NAME = 'Name.First' OR COLUMN_NAME = 'MName.Last' OR COLUMN_NAME = 'PhoneNumber'
          )
BEGIN
ALTER TABLE TABLE_NAME
ALTER COLUMN [COLUMN_NAME] NVARCHAR(200) MASKED WITH (FUNCTION = 'default()') NULL
END

Это не работает. Любые идеи?


person Robi Morro    schedule 18.02.2019    source источник
comment
Я даже не вижу смысла в таком подходе. Если вы хотите замаскировать определенные столбцы, то почему бы просто не создать представление (или, может быть, процедуру), которое представляет ваши данные безопасным способом?   -  person Tim Biegeleisen    schedule 18.02.2019
comment
Привет Тим, Спасибо за быстрый ответ. Проблема не в безопасности, а в gdpr. Я мог бы обновить столбцы, но мне просто интересно, является ли маскирование лучшим вариантом.   -  person Robi Morro    schedule 18.02.2019
comment
Я говорю, просто напишите выбор, который генерирует вывод, который вы хотите увидеть, и забудьте об этом. Существуют всевозможные предостережения при копировании ваших данных, например, данные, которые не замаскированы, могут легко устареть при изменении их исходного источника.   -  person Tim Biegeleisen    schedule 18.02.2019
comment
хорошо, я вас понимаю, но, к сожалению, у меня нет выбора :)   -  person Robi Morro    schedule 18.02.2019


Ответы (2)


Вам нужно использовать цикл для выполнения вашего кода DDL с использованием динамического sql

DECLARE @tmp TABLE (ID int identity, TableName varchar(100), ColumnName varchar(100)

INSERT @tmp
SELECT QUOTENAME(TABLE_NAME), QUOTENAME(COUMN_NAME)
          FROM INFORMATION_SCHEMA.COLUMNS
          WHERE TABLE_NAME = 'TableName' and 
          COLUMN_NAME = 'BirthDate' OR COLUMN_NAME = 'EmailAddress' OR COLUMN_NAME = 'FirstName' OR COLUMN_NAME = 'LastName' OR COLUMN_NAME = 'MiddleName' OR COLUMN_NAME = 'Name.First' OR COLUMN_NAME = 'MName.Last' OR COLUMN_NAME = 'PhoneNumber'
          )
DECLARE @ID int, @TableName varchar(100), @ColumnName varchar(100)
DECLARE @SQL varchar(MAX)
WHILE EXISTS (SELECT 1 FROM @tmp)
BEGIN
    SELECT TOP 1 @ID = ID, @TableName = TableName, @ColumnName = ColumnName

    SET @SQL = '
    ALTER TABLE ' + @TableName + '
    ALTER COLUMN ' + @ColumnName + ' NVARCHAR(200) MASKED WITH (FUNCTION = ''default()'') NULL
    '
    EXEC(@SQL)
    DELETE @tmp WHERE ID = @ID
END
person Daniel Brughera    schedule 18.02.2019

Вам нужно будет сделать это с помощью Dynamic SQL. Используйте свой запрос Information_Schema для динамического создания необходимых операторов ALTER TABLE, а затем выполните их.

person Tab Alleman    schedule 18.02.2019
comment
Привет Tab, спасибо за ваш ответ. Не могли бы вы привести пример? - person Robi Morro; 18.02.2019
comment
Проверьте здесь, пример для добавления столбца, но его можно легко изменить, чтобы вместо этого изменить столбец: stackoverflow.com/questions/2614101/ - person Tab Alleman; 18.02.2019