J'ai une table DB2 qui a un champ contenant une valeur spécifique (numéros de SÉCURITÉ SOCIALE). Je dois modifier la valeur du champ de chaque ligne en fonction du contenu du champ. Je saisis la valeur du champ d'origine et en fonction de celle-ci, je crée une nouvelle valeur. En gros, j'utilise la valeur d'origine comme germe pour créer une nouvelle valeur, donc j'ai besoin de connaître chaque valeur et de mettre à jour le champ en fonction de celle-ci ... Je suis désolé d'être si vague, j'essaie toujours de comprendre tout cela.

Ce SQL a changé toutes les valeurs en une seule valeur qui est incorrecte Update Table set SSN = '123-45-6789'

J'ai besoin de:

  1. Obtenez la valeur du champ
  2. En utilisant la valeur actuelle comme valeur de départ, masquez-la à l'aide d'une formule simple

619-46-0988 ---> 427-95-1143
424-09-8912 ---> 699-01-4628
619-46-0988 ---> 427-95-1143

Notez que 619-46-0988 est modifié de manière cohérente car la valeur d'origine était la même

Merci beaucoup,

Barbara

0
Barbara 26 août 2020 à 04:55

3 réponses

Meilleure réponse

Probablement l'exemple de fonction de masquage le plus simple.
Résultat unique et cohérent sur un ensemble unique de SSN avec un paramètre 2-ème constant.

CREATE OR REPLACE FUNCTION SSN_MASK(P_SSN VARCHAR(11), P_MASK VARCHAR(9)) 
RETURNS VARCHAR(11)
CONTAINS SQL
DETERMINISTIC 
NO EXTERNAL ACTION
RETURN
CASE
   WHEN 
         REGEXP_LIKE(P_SSN,  '^[\d]{3}-[\d]{2}-[\d]{4}$')
     AND REGEXP_LIKE(P_MASK, '^[\d]{9}$')
   THEN
        MOD(INT(SUBSTR(P_SSN,  1, 1)) + INT(SUBSTR(P_MASK, 1, 1)), 10)
     || MOD(INT(SUBSTR(P_SSN,  2, 1)) + INT(SUBSTR(P_MASK, 2, 1)), 10)
     || MOD(INT(SUBSTR(P_SSN,  3, 1)) + INT(SUBSTR(P_MASK, 3, 1)), 10)
     || '-'
     || MOD(INT(SUBSTR(P_SSN,  5, 1)) + INT(SUBSTR(P_MASK, 4, 1)), 10)
     || MOD(INT(SUBSTR(P_SSN,  6, 1)) + INT(SUBSTR(P_MASK, 5, 1)), 10)
     || '-'
     || MOD(INT(SUBSTR(P_SSN,  8, 1)) + INT(SUBSTR(P_MASK, 6, 1)), 10)
     || MOD(INT(SUBSTR(P_SSN,  9, 1)) + INT(SUBSTR(P_MASK, 7, 1)), 10)
     || MOD(INT(SUBSTR(P_SSN, 10, 1)) + INT(SUBSTR(P_MASK, 8, 1)), 10)
     || MOD(INT(SUBSTR(P_SSN, 11, 1)) + INT(SUBSTR(P_MASK, 9, 1)), 10)
END
;
    
SELECT V, SSN_MASK(V, '123456789') V_MASKED 
FROM 
(
VALUES 
  '619-46-0988'
, '424-09-8912'
, '619-46-0988'
, 'ABC'
) T(V);
    
The result is: 
        
|V          |V_MASKED   |
|-----------|-----------|
|619-46-0988|732-81-6667|
|424-09-8912|547-44-4691|
|619-46-0988|732-81-6667|
|ABC        |NULL       |
0
Mark Barinstein 27 août 2020 à 10:15

Vous pouvez utiliser le UPDATE. Vous n'avez pas spécifié comment la nouvelle valeur est calculée, mais c'est un scénario courant pour faire référence à la valeur existante: Le nouveau salaire de chaque employé INDIVIDUEL doit être basé sur le salaire existant actuel.

L'expression pour calculer la nouvelle valeur peut être n'importe quelle expression. Ainsi, vous pouvez le rechercher dans une autre table ou le calculer dans une fonction.

UPDATE myTable SET column = computedValue(column) WHERE howToIdentifyThoseToChange
0
data_henrik 26 août 2020 à 05:02

Je veux dire, vous pouvez utiliser le SSN comme graine de System.Random, et cela renverra toujours une valeur suivante prévisible. Tant que la fonction RNG ne change pas, elle est cohérente.

Vous pouvez faire ceci:

PS C:\> $rng = [System.Random]::new([int]'619-46-0988'.Replace('-',''))
PS C:\> $rng.Next(1e9).ToString('000-00-0000')
010-05-3964

Ou ca:

PS C:\> (Get-Random -Maximum 1e9 -SetSeed ([int]'619-46-0988'.Replace('-',''))).ToString('000-00-0000')
660-94-7295

Devriez-vous le faire de cette façon? Absolument pas. Ce n'est pas sécurisé et il est trivial de générer tout l'espace de clé utilisé et de créer une table arc-en-ciel. De plus, il ne génère pas de valeurs correspondant aux les plages SSN autorisées (par exemple, non commençant par 000), ils peuvent donc ne pas être appropriés en fonction de votre application.

Une plus bonne façon de faire cela serait de traiter le SSN comme un mot de passe, probablement avec quelque chose comme bcrypt / scrypt ou PBKDF2 ou une autre fonction de hachage cryptographique, puis utiliser le hachage pour générer plus directement un Numéro à 9 chiffres qui "devient" le nouveau SSN (par exemple, consommez les octets les moins significatifs pour créer un entier à 9 chiffres).

Cependant, dans toutes les circonstances que je pourrais imaginer, le problème de "Je dois masquer les SSN", ma solution préférée serait "d'ajouter une nouvelle colonne à la table ou de créer une nouvelle table, puis de créer des clés de substitution associées à la clé de table de personne, et puis purgez les SSN en valeurs nulles et utilisez les substituts lorsque j'ai besoin de le faire ". Heck, vos clés de substitution pourraient simplement être la sortie de (Get-Random -Maximum 1e9).ToString('000-00-0000') qui, pour autant que je sache (mais faites vos propres recherches), utilise System.Security.Cryptography.RandomNumberGenerator. Même dans ce cas, je ne voudrais pas garder les clés de substitution très longtemps.

0
Bacon Bits 26 août 2020 à 05:01