私は、代理PKと多数の重複する行を持つ1990年(はい、27年前)に作成されたテーブルを持っています。私はAccessからSQL Serverにテーブルを移行していますが、私は代理キーフィールドを削除しましたが、null値を含むことができる2つのソース列の計算カラムを含める方法を理解しようとしています。 これは私の作品:日付と数値を含む計算列は、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
あなたはプレーンテキストでSSNの保存を停止する必要があります。それは信じられないほど無責任なだけでなく、多くの州で違法です。そして、あなたがその州でビジネスをしなくてもこの種の情報が侵害された場合には、責任を負うことができる法的判例があります。マサチューセッツ州はそのような州の一つです。 SSNは塩漬けされハッシュされる必要があります。常に暗号化する必要があります。 –
実際には、私はこのデータを使ってすべきことがたくさんありますが、今はRIを適用している別のバックエンドに移すことに焦点を当てています。 – Beth
プライマリキーの一部としてクリアテキストでSSNを使用するのはひどいです。私のデータがこのシステムの近くにないことを願っています。私はあなたのビジネスに苦痛を感じています。しかし、真剣に、この問題に悩まされています。このタイプのデータを維持することは、ある時点でそれが欠点を抱えているために修正されなければならない仕事です修復。企業が多くの法律上の理由により危険にさらされているため、そのデータを暗号化することが優先事項です。私はこれを旗竿の上に送り、彼らが弁護士と話すことを提案する。冗談ではありません。これは深刻です。 –