これはかなり初心者向けの質問です。私は80年代と90年代の奇妙な設計上の決定をした古い学校のPowerBuilderソフトウェア(PowerCampus)を使用しています。
システムでおそらく最も重要なテーブルは何ですかdbo.ACADEMIC
には、複数の列で構成されるクラスター化された主キーのみがあります。 SELECT
およびUPDATE
行をdbo.ACADEMIC
GUIDなどの不変のキーを使用しますが、テーブルを変更することもできません。
このテーブルの構造を変更できない理由はたくさんありますが、その主な理由は、ある学校がそれを試してデスクトップクライアントソフトウェアを壊したことです。
ACADEMIC
の主キーの簡単なサンプルを次に示します。
PEOPLE_CODE_ID ACADEMIC_YEAR ACADEMIC_TERM CURRICULUM
-------------- ------------- ------------- ----------
P000011111 1996 SPRING URBAN
P000022222 2012 SPRING HCSMGT
P000033333 2002 SUMMER CHEMIS
P000044444 2015 FALL SEDUCA
P000055555 1983 SUMMER POLSCI
キーの一部である一部の列は、学生がカリキュラムを変更した場合など、大幅に変更されます。この不変のIDがないため、他のシステムとの統合は非常に困難です。
これは、一意の主キーとACADEMIC
からの識別列を含む別のテーブルを作成することで解決できますか?次に、ACADEMIC
からのすべてのデータとid
列を表示するビューを作成できます。統合プロジェクトはこのビューを使用できます。
提案されたcustom.AcademicKey
テーブル:
id PEOPLE_CODE_ID ACADEMIC_YEAR ACADEMIC_TERM CURRICULUM
------------------------------------ -------------- ------------- ------------- ----------
956EB195-C7C3-4E47-9A1B-0000191B95A2 P000011111 1996 SPRING URBAN
FE00D2F4-5F5E-45D2-AB63-00002CC92F40 P000022222 2012 SPRING HCSMGT
C1AF44CD-DDD1-4D46-A19E-0000A841B70F P000033333 2002 SUMMER CHEMIS
D4E8FC3F-CECC-4195-9924-0000B9BC33A7 P000044444 2015 FALL SEDUCA
456B16ED-C504-456B-A2E5-00019F244A95 P000055555 1983 SUMMER POLSCI
ACADEMIC
のクラスター化キーに関連付けられた外部キーはこれを実現しますか?
新しい行をACADEMIC
に入力するには、トリガーをAcademicKey
に追加する必要がありますか?
これは、一意の主キーとACADEMICの識別列を含む別のテーブルを作成することで解決できますか?
はい。最低限、外部キーとAFTER INSERTトリガーが必要です。
例えば
use tempdb
go
--create schema custom
go
--drop table if exists custom.AcademicKey
--drop table if exists dbo.Academic
go
create table dbo.Academic
(
PEOPLE_CODE_ID varchar(20),
ACADEMIC_YEAR int,
ACADEMIC_TERM varchar(10),
CURRICULUM varchar(20),
constraint pk_Academic
primary key (PEOPLE_CODE_ID, ACADEMIC_YEAR, ACADEMIC_TERM, CURRICULUM)
)
create table custom.AcademicKey
(
Id uniqueidentifier default (newsequentialid()),
PEOPLE_CODE_ID varchar(20),
ACADEMIC_YEAR int,
ACADEMIC_TERM varchar(10),
CURRICULUM varchar(20),
constraint pk_Academic
primary key nonclustered (id),
constraint ak_AcademicKey
unique clustered (PEOPLE_CODE_ID, ACADEMIC_YEAR, ACADEMIC_TERM, CURRICULUM),
constraint fk_AcademicKey_Adademic
foreign key (PEOPLE_CODE_ID, ACADEMIC_YEAR, ACADEMIC_TERM, CURRICULUM)
references Academic (PEOPLE_CODE_ID, ACADEMIC_YEAR, ACADEMIC_TERM, CURRICULUM)
on update cascade
on delete cascade
)
go
create or alter trigger Academic_CreateAcademicKey
on dbo.Academic after insert
as
begin
set nocount on;
insert into custom.AcademicKey(PEOPLE_CODE_ID, ACADEMIC_YEAR, ACADEMIC_TERM, CURRICULUM)
select PEOPLE_CODE_ID, ACADEMIC_YEAR, ACADEMIC_TERM, CURRICULUM
from inserted;
end
go
insert into Academic(PEOPLE_CODE_ID, ACADEMIC_YEAR, ACADEMIC_TERM, CURRICULUM)
values ('P000011111', 1996, 'SPRING', ' URBAN')
select * from custom.AcademicKey
update Academic set CURRICULUM = 'CHEMIS' where PEOPLE_CODE_ID = 'P000011111'
select * from custom.AcademicKey
delete from Academic where PEOPLE_CODE_ID = 'P000011111'
select * from custom.AcademicKey