2017-02-13 4 views
1

J'ai une table créée en 1990 (oui, il y a 27 ans) qui a un PK de substitution et beaucoup de lignes dupliquées. Je migre la table d'Access to SQL Server et j'ai supprimé le champ de clé de substitution, mais j'essaie de comprendre comment inclure une colonne calculée à partir de deux colonnes source pouvant contenir des valeurs nulles. Cela fonctionne pour moi:La colonne calculée avec la date et le numéro, mais pas les deux, peut être nulle, dans PK

CREATE TABLE [dbo].[ActionHistory] 
(
    [Position Number] [int] NOT NULL, 
    [SSN] [nvarchar](11) NOT NULL, 
    [Action] [nvarchar](10) NOT NULL, 

    [EffectiveSalaryKey] AS (CONVERT([varchar](20), [Action Effective Date], 20) + ';' + 
           CONVERT([varchar](20), isnull([Salary], ''), 0)) PERSISTED NOT NULL, 
    [Action Effective Date] [datetime] NULL, 
    [Salary] [money] NULL, 
    ..., 
    [entered] [datetime] NULL 
     CONSTRAINT [DF_ActionHistory_entered] DEFAULT (getdate()), 

    CONSTRAINT [PK_ActionHistory] 
     PRIMARY KEY CLUSTERED ([Position Number] ASC, [SSN] ASC, [Action] ASC, [EffectiveSalaryKey] ASC) 
    ... 
) 

mais il ne me permet pas d'entrer des lignes avec nulles dates d'effet. Je veux faire quelque chose comme convertir des dates nulles en blancs pour le champ clé, ou même une valeur statique comme 1/1/1900 00:00:00, mais je ne peux pas obtenir la bonne syntaxe.

J'ai essayé d'ajouter isnull(date,'') avant la conversion à varchar, après la conversion, et après l'ajout du séparateur, mais ils ne fonctionnent pas, et j'ai aussi essayé d'ajouter isnull(date,'1900-01-01 00:00:00') mais cela ne fonctionne pas non plus.

Lorsque je tente:

[EffectiveSalaryKey] AS 
    (
     CONVERT(
      [varchar](20),isnull([Action Effective Date],''),20 
       ) 

il dit:

Computed column 'EffectiveSalaryKey' in table 'ActionHistory' cannot be persisted because the column is non-deterministic. 

Je fais cela avec le script, en dehors de l'interface graphique, comme je crois comprendre qu'il ya un bug là-bas pour ce type d'affectation . Je comprends également que le style doit être fourni lors de la conversion de la date en varchar. S'il vous plaît laissez-moi savoir comment je devrais ajouter ces valeurs de champ afin que je puisse utiliser la colonne calculée dans le cadre de la PK.

Merci,

-Beth

+1

Avant de faire quoi que ce soit d'autre que vous devez arrêter le stockage dans le texte brut SSN. Non seulement c'est incroyablement irresponsable, mais c'est illégal dans de nombreux États. Et certains états ont des précédents juridiques qu'ils peuvent vous tenir responsable si vous avez ce type d'information qui est violé même si vous ne faites pas d'affaires dans cet état. Le Massachusetts est un de ces états. Le SSN doit être salé et haché. Il doit être chiffré à tout moment. –

+0

En fait, il y a beaucoup de choses que je devrais faire avec ces données, mais pour le moment, je suis concentré sur le déplacement vers un autre backend où RI est appliqué. – Beth

+0

Bien utiliser SSN en texte clair dans le cadre d'une clé primaire est tout simplement horrible. J'espère vraiment que mes données sont loin de ce système.Je ressens votre douleur à cause des affaires, vous obligeant à vous en tenir à la tâche, mais sérieusement, cela pose beaucoup de problèmes et tout ce que vous faites pour maintenir ce type de données est un travail qui devra être corrigé à un moment donné. réparation. Le cryptage de ces données doit être prioritaire, car votre entreprise est exposée à un certain nombre de raisons juridiques. J'enverrais le drapeau et suggérerais de parler avec un avocat. Je ne plaisante pas. C'est sérieux. –

Répondre

1

Je recommande d'utiliser une clé de substitution sur ce tableau ainsi, et compléter avec un index unique. (Ainsi que des espaces remplaçant dans les noms de colonnes avec des underscores)

Pour votre colonne calculée, je pense que c'est ce que vous recherchez:

, effectivesalarykey as (
     isnull(convert(varchar(20),[action_effective_date],20)+ ';','') 
     + isnull(convert(varchar(20),salary),'0') 
    ) persisted not null 

Vous pouvez modifier la première '' dans la première isnull à ce que vous aimez

, effectivesalarykey as (
     isnull(convert(varchar(20),[action_effective_date],20)+ ';','1900-01-01 00:00:00;') 
     + isnull(convert(varchar(20),salary),'0') 
    ) persisted not null 

rextester: http://rextester.com/SBA4540

create table dbo.actionhistory(
    id int not null identity(1,1) 
    , position_number int not null 
    , ssn nvarchar(11) not null 
    , action nvarchar(10) not null 
    , effectivesalarykey as (
     isnull(convert(varchar(20),[action_effective_date],20)+ ';','') 
     + isnull(convert(varchar(20),salary),'0') 
    ) persisted not null 
    , 
    [action_effective_date] datetime null 
    , salary money null 
    , entered datetime null constraint df_actionhistory_entered default (getdate()) 
    , constraint pk_actionhistory primary key clustered (id) 
); 

create unique nonclustered index ix_actionhistory_position_ssn_action_effectivesalarykey 
    on dbo.actionhistory (
     position_number asc 
    , ssn asc 
    , action asc 
    , effectivesalarykey asc) 


insert into dbo.actionhistory (position_number,ssn,action) values 
(1,'000-00-0000','Test') 

select * 
from dbo.actionhistory; 

résultats:

+----+-----------------+-------------+--------+--------------------+-----------------------+--------+---------------------+ 
| id | position_number |  ssn  | action | effectivesalarykey | action_effective_date | salary |  entered  | 
+----+-----------------+-------------+--------+--------------------+-----------------------+--------+---------------------+ 
| 1 |    1 | 000-00-0000 | Test |     0 | NULL     | NULL | 13.02.2017 20:35:21 | 
+----+-----------------+-------------+--------+--------------------+-----------------------+--------+---------------------+ 
+1

Je jure que j'ai essayé, mais je pense que c'était dans l'interface graphique. L'idée était de laisser les champs tranquilles afin de ne pas briser les dépendances en aval dans les requêtes, les formulaires et les rapports, donc pour l'instant, je ne m'inquiète pas pour ça. J'ai une autre table avec de plus gros problèmes à migrer. Merci pour votre aide, ça fonctionne maintenant. – Beth

+0

@Beth Joyeux de vous aider! – SqlZim