Search code examples
sqlsql-serverdata-maskingsql-data-warehouse

Is it possible to alter columns by matching them to another temporary table that exist?


I am working on masking personal data in several databases in SQL Datawarehouse. I have created a table with columns that i want to be masked and would like to alter these columns that exists in several tables in a database by a single script like this

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

This does not work. Any ideas?


Solution

  • Yo need to use a loop to execute your DDL code using dynamic 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