【问题标题】:SQL Server : Update Table - Data MaskSQL Server:更新表 - 数据掩码
【发布时间】:2014-09-23 18:34:00
【问题描述】:

我创建了一个数据掩码,它可以在字符串中的任意位置找到一个 16 位数字,并将除最后四个字符之外的所有字符都替换为 X。

但我需要更新位于表中的列中的所有数据,而不是手动设置字符串。到目前为止,请查看我的代码:

DECLARE
    @NOTES AS VARCHAR(8000)

SET @NOTES = 'Returns the starting position of the first occurrence of a pattern in a specified  expression, 1234567891234567 or zeros if the pattern is not found, on all valid text and character data types'

SELECT 
   REPLACE(@NOTES, SUBSTRING(@NOTES, PATINDEX('%1%2%3%4%5%6%7%8%9%', @NOTES), 16), 'XXXXXXXXXXXX' + RIGHT(SUBSTRING(@NOTES, PATINDEX('%1%2%3%4%5%6%7%8%9%', @NOTES),16),4)) AS REPLACEMENT

任何帮助将不胜感激:-)

【问题讨论】:

  • 所以,你在问什么? “做我的工作,我不想用我的大脑?”如果你有一个特定的问题(你从“我已经创建”开始,表明它已经完成了工作)那么你完全没有意义去问它。
  • 您遇到的具体问题是什么?
  • 我希望将掩码应用于更新语句
  • 你已经说过了。这种重复的陈述怎么可能有帮助?
  • 我只是在寻求帮助,而不是打算让人们结束。

标签: sql sql-server sql-server-2008 data-masking


【解决方案1】:

用你的逻辑创建一个函数

CREATE FUNCTION MyMask(
    @NOTES  VARCHAR(8000))

    returns varchar(8000)

    BEGIN
    RETURN 
       REPLACE(@NOTES, SUBSTRING(@NOTES, PATINDEX('%1%2%3%4%5%6%7%8%9%', @NOTES), 16), 'XXXXXXXXXXXX' + RIGHT(SUBSTRING(@NOTES, PATINDEX('%1%2%3%4%5%6%7%8%9%', @NOTES),16),4))

    END

这就是你使用它的人

update table
set field = dbo.myMask(field)
where some condition

【讨论】:

  • 我想,但不确定如何将我提供的代码应用到函数中。
  • 好的,请稍等。我将把它转换成一个可用的代码
  • 检查一下,让我敲门
  • 谢谢,我运行 CREATE 函数并成功完成消息命令,它位于标量值函数下,但我尝试运行更新代码,我收到消息“myMask” ' 不是可识别的内置函数名。
  • 一个轻微的错字,只是意识到它应该是 'update credit_cards set card_number = dbo.MyMask(card_number)' 但是掩码函数现在只处理前 16 个字符,不管它是否是 16 位数字子串。
【解决方案2】:

Horaciux 提供的函数是静态声明的字符串,但在更新查询中使用时 PATINDEX 始终设置为 0。

解决方法是将 PATINDEX 的实现从 PATINDEX('%1%2%3%4%5%6%7%8%9%' 修改为 PATINDEX('%[123456789]%' 我已包含以下完整功能:

CREATE FUNCTION [dbo].[MyMask](@NOTES VARCHAR(8000)) RETURNS VARCHAR(8000)
BEGIN
RETURN 
    REPLACE(@NOTES, SUBSTRING(@NOTES, PATINDEX('%[123456789]%', @NOTES), 16), 'XXXXXXXXXXXX' + RIGHT(SUBSTRING(@NOTES, PATINDEX('%[123456789]%', @NOTES),16),4))
END

我希望这对其他人有用:-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 2020-11-29
    • 2018-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多