I found my "with FK" example:
This works as is.
You can also read all my inline notes about
ON UPDATE CASCADE
and you can optional use that method instead.
My point is that if you don't like the randomness of NEWID (or UserId in
Membership) there are some things you can...
that will still leave the Membership tables alone and AS IS.
if exists (select * from dbo.sysobjects where id =
object_id(N'[dbo].[HospitalVisit]') and OBJECTPROPERTY(id, N'IsUserTable') =
1)
BEGIN
DROP TABLE [dbo].[HospitalVisit]
END
GO
if exists (select * from dbo.sysobjects where id =
object_id(N'[dbo].[Patient]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
BEGIN
DROP TABLE [dbo].[Patient]
END
GO
CREATE TABLE [dbo].[Patient] (
[PatientUUID] [uniqueidentifier] primary key not null default NEWID()
,--<<Intentionally a NEWID to "random it up" some --NEWSEQUENTIALID() ,
PatientLastName varchar(32) not null ,
PatientFirstName varchar(32) not null ,
DateOfBirth smalldatetime not null ,
SignupDate smalldatetime not null default CURRENT_TIMESTAMP ,
AdmittedDate smalldatetime not null ,
CustomerRating smallint not null default 0 CHECK(CustomerRating > 0 AND
CustomerRating < 6)
--CONSTRAINT Pat_PatName_UNIQUE UNIQUE ([PatientUUID] , PatientName)
)
GO
CREATE TABLE [dbo].[HospitalVisit] (
[HospitalVisitUUID] [uniqueidentifier] primary key not null default
NEWSEQUENTIALID() ,
HospitalVisitKey smallint not null ,
[PatientUUID] [uniqueidentifier] not null , --Moved to be a ADD CONSTRAINT
so it could have a Hard Coded Name -- FOREIGN KEY (PatientUUID) REFERENCES
dbo.Patient(PatientUUID),
HospitalVisitName varchar(32) not null ,
HospitalVisitDescription varchar(128) not null ,
CONSTRAINT HospitalVisit_HospitalVisitName_UNIQUE UNIQUE (PatientUUID ,
HospitalVisitName) ,
CONSTRAINT HospitalVisit_HospitalVisitKey_UNIQUE UNIQUE (HospitalVisitKey)
)
ALTER TABLE dbo.[HospitalVisit]
ADD CONSTRAINT FK_HV_To_Patient_PatientUUID
FOREIGN KEY ( PatientUUID )
REFERENCES dbo.Patient ( PatientUUID )
--ON UPDATE CASCADE -- << Comment out this line to experiment
GO
/*
IF EXISTS (SELECT name FROM sysindexes WHERE name = 'PK_Patient')
DROP INDEX Patient.PK_Patient
CREATE UNIQUE CLUSTERED INDEX PK_Patient ON [dbo].Patient(PatientUUID)
G--O
*/
IF EXISTS (SELECT name FROM sysindexes WHERE name =
'IX_HospitalVisit_PatientUUID')
DROP INDEX HospitalVisit.IX_HospitalVisit_PatientUUID
CREATE INDEX IX_HospitalVisit_PatientUUID ON
[dbo].HospitalVisit([PatientUUID])
GO
GRANT SELECT , INSERT, UPDATE, DELETE ON dbo.Patient TO
hospitaluser--[[[[DBUSERNAME]]]]
GO
GRANT SELECT , INSERT, UPDATE, DELETE ON dbo.HospitalVisit TO
hospitaluser--[[[[DBUSERNAME]]]]
GO
set nocount on
delete from dbo.Patient
INSERT INTO dbo.Patient ( PatientLastName , PatientFirstName , DateOfBirth ,
AdmittedDate , CustomerRating )
values ( 'Einstein' , 'Roger' , '05/05/1975' , '02/02/1995' , 3 )
INSERT INTO dbo.Patient ( PatientLastName , PatientFirstName , DateOfBirth ,
AdmittedDate , CustomerRating )
values ( 'Banana' , 'Ulysses' , '05/05/1972' , '02/02/1998' , 1 )
INSERT INTO dbo.Patient ( PatientLastName , PatientFirstName , DateOfBirth ,
AdmittedDate , CustomerRating )
values ( 'Donner' , 'Samantha' , '05/05/1974' , '02/02/1996' , 2 )
INSERT INTO dbo.Patient ( PatientLastName , PatientFirstName , DateOfBirth ,
AdmittedDate , CustomerRating )
values ( 'Cucumber' , 'Tommy' , '05/05/1973' , '02/02/1997' , 4 )
INSERT INTO dbo.Patient ( PatientLastName , PatientFirstName , DateOfBirth ,
AdmittedDate , CustomerRating )
values ( 'Apple' , 'Vicky' , '05/05/1971' , '02/02/1999' , 5 )
INSERT INTO dbo.HospitalVisit
(HospitalVisitKey,PatientUUID,HospitalVisitName,HospitalVisitDescription)
Select DENSE_RANK() OVER (ORDER BY CustomerRating ASC) AS ROWID ,
PatientUUID , 'Visit For ' + PatientLastName + ', ' + PatientFirstName ,
PatientFirstName + ' enjoyed his/her time at the hospital'
from dbo.Patient p Group By PatientUUID , PatientLastName , PatientFirstName
, CustomerRating
Select * from dbo.HospitalVisit
print ''
print 'Before any reordering'
select p.PatientUUID , derived1.HospitalVisitName , * from dbo.Patient p
join
( Select * from dbo.HospitalVisit hv ) as derived1
on p.PatientUUID = derived1.PatientUUID
declare @reorder1 table ( OldPatientUUID [uniqueidentifier] , NewPatientUUID
[uniqueidentifier] not null default NEWSEQUENTIALID() )
insert into @reorder1 ( OldPatientUUID )
Select PatientUUID from dbo.Patient ORDER BY CustomerRating
--select * from @reorder1
BEGIN TRAN
--If you keep the ""ON UPDATE CASCADE"" from above...you can skip this DROP
CONSTRAINT
ALTER TABLE dbo.[HospitalVisit]
DROP CONSTRAINT FK_HV_To_Patient_PatientUUID
Update dbo.Patient
Set PatientUUID = ro.NewPatientUUID
From
dbo.Patient p , @reorder1 ro
Where
p.PatientUUID = OldPatientUUID
Update dbo.HospitalVisit
Set PatientUUID = ro.NewPatientUUID
FROM
dbo.HospitalVisit hv , @reorder1 ro
Where
hv.PatientUUID = ro.OldPatientUUID
--If you keep the ""ON UPDATE CASCADE"" from above...you can skip this (re)
ADD CONSTRAINT
ALTER TABLE dbo.[HospitalVisit]
ADD CONSTRAINT FK_HV_To_Patient_PatientUUID
FOREIGN KEY ( PatientUUID )
REFERENCES dbo.Patient ( PatientUUID )
COMMIT TRAN
print 'The PatientUUID PK should be in order based on the : CustomerRating'
select CustomerRating , derived1.HospitalVisitName , * from dbo.Patient p
join
( Select * from dbo.HospitalVisit hv ) as derived1
on p.PatientUUID = derived1.PatientUUID
Order by p.CustomerRating
------------------
declare @reorder2 table ( OldPatientUUID [uniqueidentifier] , NewPatientUUID
[uniqueidentifier] not null default NEWSEQUENTIALID() )
insert into @reorder2 ( OldPatientUUID )
Select PatientUUID from dbo.Patient ORDER BY AdmittedDate
--select * from @reorder2
BEGIN TRAN
--If you keep the ""ON UPDATE CASCADE"" from above...you can skip this DROP
CONSTRAINT
ALTER TABLE dbo.[HospitalVisit]
DROP CONSTRAINT FK_HV_To_Patient_PatientUUID
Update dbo.Patient
Set PatientUUID = ro.NewPatientUUID
From
dbo.Patient p , @reorder2 ro
Where
p.PatientUUID = OldPatientUUID
Update dbo.HospitalVisit
Set PatientUUID = ro.NewPatientUUID
FROM
dbo.HospitalVisit hv , @reorder2 ro
Where
hv.PatientUUID = ro.OldPatientUUID
--If you keep the ""ON UPDATE CASCADE"" from above...you can skip this (re)
ADD CONSTRAINT
ALTER TABLE dbo.[HospitalVisit]
ADD CONSTRAINT FK_HV_To_Patient_PatientUUID
FOREIGN KEY ( PatientUUID )
REFERENCES dbo.Patient ( PatientUUID )
COMMIT TRAN
print 'The PatientUUID PK should be in order based on the : AdmittedDate'
select AdmittedDate , derived1.HospitalVisitName , * from dbo.Patient p join
( Select * from dbo.HospitalVisit hv ) as derived1
on p.PatientUUID = derived1.PatientUUID
Order by p.AdmittedDate
------------------
declare @reorder3 table ( OldPatientUUID [uniqueidentifier] , NewPatientUUID
[uniqueidentifier] not null default NEWSEQUENTIALID() )
insert into @reorder3 ( OldPatientUUID )
Select PatientUUID from dbo.Patient ORDER BY DateOfBirth
--select * from @reorder2
BEGIN TRAN
--If you keep the ""ON UPDATE CASCADE"" from above...you can skip this DROP
CONSTRAINT
ALTER TABLE dbo.[HospitalVisit]
DROP CONSTRAINT FK_HV_To_Patient_PatientUUID
Update dbo.Patient
Set PatientUUID = ro.NewPatientUUID
From
dbo.Patient p , @reorder3 ro
Where
p.PatientUUID = OldPatientUUID
Update dbo.HospitalVisit
Set PatientUUID = ro.NewPatientUUID
FROM
dbo.HospitalVisit hv , @reorder3 ro
Where
hv.PatientUUID = ro.OldPatientUUID
--If you keep the ""ON UPDATE CASCADE"" from above...you can skip this (re)
ADD CONSTRAINT
ALTER TABLE dbo.[HospitalVisit]
ADD CONSTRAINT FK_HV_To_Patient_PatientUUID
FOREIGN KEY ( PatientUUID )
REFERENCES dbo.Patient ( PatientUUID )
COMMIT TRAN
print 'The PatientUUID PK should be in order based on the : DateOfBirth'
select DateOfBirth , derived1.HospitalVisitName , * from dbo.Patient p join
( Select * from dbo.HospitalVisit hv ) as derived1
on p.PatientUUID = derived1.PatientUUID
Order by p.DateOfBirth
----------------------
declare @reorder4 table ( OldPatientUUID [uniqueidentifier] , NewPatientUUID
[uniqueidentifier] not null default NEWSEQUENTIALID() )
insert into @reorder4 ( OldPatientUUID )
Select PatientUUID from dbo.Patient ORDER BY CustomerRating
--select * from @reorder1
BEGIN TRAN
--If you keep the ""ON UPDATE CASCADE"" from above...you can skip this DROP
CONSTRAINT
ALTER TABLE dbo.[HospitalVisit]
DROP CONSTRAINT FK_HV_To_Patient_PatientUUID
Update dbo.Patient
Set PatientUUID = ro.NewPatientUUID
From
dbo.Patient p , @reorder4 ro
Where
p.PatientUUID = OldPatientUUID
Update dbo.HospitalVisit
Set PatientUUID = ro.NewPatientUUID
FROM
dbo.HospitalVisit hv , @reorder4 ro
Where
hv.PatientUUID = ro.OldPatientUUID
--If you keep the ""ON UPDATE CASCADE"" from above...you can skip this (re)
ADD CONSTRAINT
ALTER TABLE dbo.[HospitalVisit]
ADD CONSTRAINT FK_HV_To_Patient_PatientUUID
FOREIGN KEY ( PatientUUID )
REFERENCES dbo.Patient ( PatientUUID )
COMMIT TRAN
print 'The PatientUUID PK should be in order based on the : CustomerRating'
select CustomerRating , derived1.HospitalVisitName , * from dbo.Patient p
join
( Select * from dbo.HospitalVisit hv ) as derived1
on p.PatientUUID = derived1.PatientUUID
Order by p.CustomerRating
------------------
declare @reorder5 table ( OldPatientUUID [uniqueidentifier] , NewPatientUUID
[uniqueidentifier] not null default NEWSEQUENTIALID() )
insert into @reorder5 ( OldPatientUUID )
Select PatientUUID from dbo.Patient ORDER BY PatientLastName
--select * from @reorder1
BEGIN TRAN
--If you keep the ""ON UPDATE CASCADE"" from above...you can skip this DROP
CONSTRAINT
ALTER TABLE dbo.[HospitalVisit]
DROP CONSTRAINT FK_HV_To_Patient_PatientUUID
Update dbo.Patient
Set PatientUUID = ro.NewPatientUUID
From
dbo.Patient p , @reorder5 ro
Where
p.PatientUUID = OldPatientUUID
Update dbo.HospitalVisit
Set PatientUUID = ro.NewPatientUUID
FROM
dbo.HospitalVisit hv , @reorder5 ro
Where
hv.PatientUUID = ro.OldPatientUUID
--If you keep the ""ON UPDATE CASCADE"" from above...you can skip this (re)
ADD CONSTRAINT
ALTER TABLE dbo.[HospitalVisit]
ADD CONSTRAINT FK_HV_To_Patient_PatientUUID
FOREIGN KEY ( PatientUUID )
REFERENCES dbo.Patient ( PatientUUID )
COMMIT TRAN
print 'The PatientUUID PK should be in order based on the : PatientLastName'
select PatientLastName , derived1.HospitalVisitName , * from dbo.Patient p
join
( Select * from dbo.HospitalVisit hv ) as derived1
on p.PatientUUID = derived1.PatientUUID
Order by p.PatientLastName
------------------
declare @reorder6 table ( OldPatientUUID [uniqueidentifier] , NewPatientUUID
[uniqueidentifier] not null default NEWSEQUENTIALID() )
insert into @reorder6 ( OldPatientUUID )
Select PatientUUID from dbo.Patient ORDER BY PatientFirstName
--select * from @reorder1
BEGIN TRAN
--If you keep the ""ON UPDATE CASCADE"" from above...you can skip this DROP
CONSTRAINT
ALTER TABLE dbo.[HospitalVisit]
DROP CONSTRAINT FK_HV_To_Patient_PatientUUID
Update dbo.Patient
Set PatientUUID = ro.NewPatientUUID
From
dbo.Patient p , @reorder6 ro
Where
p.PatientUUID = OldPatientUUID
Update dbo.HospitalVisit
Set PatientUUID = ro.NewPatientUUID
FROM
dbo.HospitalVisit hv , @reorder6 ro
Where
hv.PatientUUID = ro.OldPatientUUID
--If you keep the ""ON UPDATE CASCADE"" from above...you can skip this (re)
ADD CONSTRAINT
ALTER TABLE dbo.[HospitalVisit]
ADD CONSTRAINT FK_HV_To_Patient_PatientUUID
FOREIGN KEY ( PatientUUID )
REFERENCES dbo.Patient ( PatientUUID )
COMMIT TRAN
print 'The PatientUUID PK should be in order based on the :
PatientFirstName'
select PatientFirstName , derived1.HospitalVisitName , * from dbo.Patient p
join
( Select * from dbo.HospitalVisit hv ) as derived1
on p.PatientUUID = derived1.PatientUUID
Order by p.PatientFirstName
------------------