2017-02-13 4 views
1

대리 키와 많은 중복 행이있는 1990 년 (예, 27 년 전)에 작성된 테이블이 있습니다. Access에서 SQL Server로 테이블을 마이그레이션하고 대리 키 필드를 삭제했지만 널 값을 포함 할 수있는 두 개의 원본 열에서 계산 된 열을 포함하는 방법을 파악하려고합니다.날짜와 숫자가 포함 된 계산 된 열 (둘 중 하나만 포함될 수 있음)은 PK의 일부로 null 일 수 있습니다.

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) 
    ... 
) 

을하지만 내가 널 효과적인 날짜와 행을 입력 할 수 없습니다 : 이 나를 위해 작동합니다.

NULL 필드를 키 필드의 공백으로 변환하거나 심지어 1/1/1900 00:00:00과 같은 정적 값을 변환하고 싶습니다. 그러나 구문을 올바르게 가져올 수 없습니다.

변환 전에 varchar으로 변환하기 전에 isnull(date,'')을 추가하려고 시도했지만 구분 기호를 추가 한 후 작동하지 않았고 isnull(date,'1900-01-01 00:00:00')을 추가하려고했지만 그 중 하나도 작동하지 않았습니다.

내가하려고하면 :

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

는 말한다 :

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

나는 GUI 외부 스크립트로이 일을 해요, 나는 버그가 할당이 유형 거기에있어 이해 . 또한 스타일을 날짜에서 varchar로 변환 할 때 제공해야한다는 것을 알고 있습니다.

계산 된 열을 PK의 일부로 사용할 수 있도록이 필드 값을 추가하는 방법을 알려주십시오.

감사합니다,

-Beth

+1

당신은 일반 텍스트로 SSN을 저장 중지해야합니다. 엄청나게 무책임 할뿐만 아니라 많은 주에서는 불법입니다. 그리고 일부 주에서는 해당 주에서 사업을하지 않더라도 이러한 유형의 정보가 유출 된 경우 책임을 물을 수 있다는 법적 선례가 있습니다. 매사추세츠주는 그러한 주 중 하나입니다. SSN은 소금에 절여 해싱해야합니다. 항상 암호화해야합니다. –

+0

실제로이 데이터로 수행해야 할 많은 작업이 있지만 지금은 RI가 적용되는 또 다른 백엔드로 이동하는 데 중점을 둡니다. – Beth

+0

기본 키의 일부로 일반 텍스트에서 SSN을 사용하는 것은 끔찍한 일입니다. 내 데이터가이 시스템 근처에 있지 않기를 바랍니다.나는 당신이 당면 과제에 집중하도록 강요하는 사업에 대해 고통 스럽다고 느낍니다. 그러나 이것은 심각한 문제를 야기합니다. 이러한 유형의 데이터를 유지하는 것과 관련된 일은 어떤 시점에서 해결되어야 할 작업입니다. 수리. 회사가 여러 가지 법적 이유로 위험에 처해 있으므로 해당 데이터를 암호화하는 것이 우선 순위가되어야합니다. 나는 이것을 기둥 극까지 보내고 그들이 변호사와 이야기 할 것을 제안합니다. 농담 아니야. 이것은 진지한 일입니다. –

답변

1

나뿐만 아니라이 테이블에 서로 게이트 키를 사용하는 것이 좋습니다, 그리고 고유 인덱스로 보완한다. 귀하의 계산 열 들어

(열 밑줄 이름에 공백을 대체와 함께), 나는이 생각하는 당신은 후에 무엇 : 첫 번째 isnull에서

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

을 변경할 수있는 최초의 '' 당신이 원하는대로에

, 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; 

결과 : 다른 작업을 수행하기 전에

+----+-----------------+-------------+--------+--------------------+-----------------------+--------+---------------------+ 
| 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

나는 그것을 시도했지만 GUI 안에 있다고 생각한다. 아이디어는 필드를 그대로 두어 쿼리, 폼 및 보고서의 다운 스트림 종속성을 손상시키지 않으므로 지금은 걱정하지 않습니다. 마이그레이션 할 문제가있는 테이블이 하나 더 있습니다. 도움을 주셔서 감사합니다. 지금 작동 중입니다. – Beth

+0

@ 베스 도와 드리겠습니다! – SqlZim