/* -------------------------------------------------------------------------
Jade Cheng
ICS 321 Assignment 3
December 12, 2008
PART 2.2
Create a stored procedure that will create an instance of a person. This
stored procedure must also be able to create an instance of a
PERSON_SKILL, BADGE assignment, Full Time data or Part Time data
depending on the employee status. Name this procedure
CreatePersonInstance. Generate your own user defined error message for
error conditions.
------------------------------------------------------------------------- */
USE DB9975
GO
-------------------------------------------------------------------------------
-- NOTE: It is possible that more than one skill is associated with a person.
-- Therefore, this procedure and the next are implemented to add and remove
-- skills associated with people.
CREATE PROCEDURE AssociatePersonSkill( @PersonId INT, @SkillId INT ) AS
-- Lock the database in here. Use the most restrictive lock because speed
-- is not an issue.
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION
-- Check to make sure the person exists.
DECLARE @TempPersonTable TABLE ( one INT )
INSERT INTO @TempPersonTable
SELECT TOP 1 1
FROM PERSON
WHERE Id = @PersonId;
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRANSACTION
RAISERROR('Invalid person id.', 16, -1, @PersonId)
RETURN 50000
END
-- Check to make sure the skill exists.
DECLARE @TempSkillTable TABLE ( one INT )
INSERT INTO @TempSkillTable
SELECT TOP 1 1
FROM SKILL
WHERE Id = @SkillId;
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRANSACTION
RAISERROR('Invalid skill id.', 16, -1, @PersonId)
RETURN 50000
END
-- Check to make sure the skill isn't already associated.
DECLARE @TempPersonSkillTable TABLE ( one INT )
INSERT INTO @TempPersonSkillTable
SELECT TOP 1 1
FROM PERSON_SKILL
WHERE SkillId = @SkillId AND PersonId = @PersonId;
IF @@ROWCOUNT <> 0
BEGIN
ROLLBACK TRANSACTION
RAISERROR('The skill is already associated.', 16, -1, @SkillId)
RETURN 50000
END
-- Finally, make the association.
INSERT INTO PERSON_SKILL ( SkillId, PersonId )
VALUES ( @SkillId, @PersonId );
COMMIT TRANSACTION
GO
-------------------------------------------------------------------------------
CREATE PROCEDURE DisassociatePersonSkill( @PersonId INT, @SkillId INT ) AS
-- Lock the database in here. Use the most restrictive lock because speed
-- is not an issue.
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION
-- Check to make sure the skill is associated.
SELECT TOP 1 1 FROM PERSON_SKILL
WHERE SkillId = @SkillId AND PersonId = @PersonId;
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRANSACTION
RAISERROR('The skill is not associated.', 16, -1, @SkillId)
RETURN 50000
END
-- Finally, disassocate the person and skill.
DELETE FROM PERSON_SKILL
WHERE SkillId = @SkillId AND PersonId = @PersonId;
COMMIT TRANSACTION
GO
-------------------------------------------------------------------------------
-- NOTE: This procedure does not allow a change to the badge issuer since this
-- is something that happens only once when the employee is hired. Similarly,
-- this procedure does not allow a change to the badge number. If the person's
-- card is damaged, it is assumed that the new badge would have the same
-- number.
CREATE PROCEDURE UpdatePersonInstance(
@PersonId INT,
@FirstName NVARCHAR(20),
@LastName NVARCHAR(20),
@MiddleName NCHAR(1),
@DateOfBirth DATETIME,
@EmploymentStatus NCHAR(1),
@Money MONEY)
AS
-- Verify the employment status is valid.
IF @EmploymentStatus NOT IN ('F', 'P')
BEGIN
ROLLBACK TRANSACTION
RAISERROR('EmploymentStatus is invalid (F/P).', 16, -1, @EmploymentStatus)
RETURN 50000
END
-- Lock the database in here. Use the most restrictive lock because speed
-- is not an issue.
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION
-- Check to make sure the person exists.
SELECT TOP 1 1 FROM PERSON WHERE Id = @PersonId;
IF @@ROWCOUNT <> 1
BEGIN
ROLLBACK TRANSACTION
RAISERROR('Invalid person id.', 16, -1, @PersonId)
RETURN 50000
END
-- Get the previous employment status.
DECLARE @OldStatus NCHAR(1)
SELECT @OldStatus = EmploymentStatus FROM PERSON WHERE Id = @PersonId;
-- Check if the employment status is changing to part time.
IF @OldStatus = 'F' AND @EmploymentStatus = 'P'
BEGIN
-- Delete the old entry.
DELETE FROM FULL_TIME WHERE Id = @PersonId;
-- Add the new record into the other table.
INSERT INTO PART_TIME ( Id, HourlySalary )
VALUES ( @PersonId, @Money );
END
-- Check if the employment status is changing to full time.
ELSE IF @OldStatus = 'P' AND @EmploymentStatus = 'F'
BEGIN
-- Delete the old entry.
DELETE FROM PART_TIME WHERE Id = @PersonId;
-- Add the new record into the other table.
INSERT INTO FULL_TIME ( Id, AnnualWage )
VALUES ( @PersonId, @Money );
END
-- Otherwise, update the full time table if they are full time.
ELSE IF @EmploymentStatus = 'F'
BEGIN
UPDATE FULL_TIME SET AnnualWage = @Money WHERE Id = @PersonId
END
-- Otherwise, update the part time table if they are part time.
ELSE IF @EmploymentStatus = 'P'
BEGIN
UPDATE PART_TIME SET HourlySalary = @Money WHERE Id = @PersonId
END
-- Update the person table.
UPDATE PERSON SET
FirstName = @FirstName,
LastName = @LastName,
MiddleName = @MiddleName,
DateOfBirth = @DateOfBirth,
EmploymentStatus = @EmploymentStatus
WHERE Id = @PersonId;
COMMIT TRANSACTION
GO
-------------------------------------------------------------------------------
-- The following commented section was used to test the procedures above.
/*
-- Find a skill called 'Bilingual'.
DECLARE @SkillId INT
SET @SkillId = dbo.GetSkillId('Bilingual');
-- Find a badge issuer with the name 'Chen'.
DECLARE @BadgeIssuerId INT
SET @BadgeIssuerId = dbo.GetBadgeIssuerId('Chen');
-- Create a new person.
EXECUTE CreatePersonInstance
@BadgeIssuerId,
'Cheng', 'Yu', NULL,
'10/13/1984',
'F',
15000,
@SkillId;
-- Check that the id exists for the person just created.
DECLARE @PersonId INT
SELECT @PersonId = Id
FROM PERSON
WHERE FirstName = 'Cheng' AND LastName = 'Yu';
-- Change some information about the person.
EXECUTE UpdatePersonInstance
@PersonId,
'Cheng2', 'Yu2', NULL,
'10/14/1984',
'P',
250
-- Display information about the person; join the full or part time tables.
-- This returns:
--
-- FirstName LastName MiddleName DateOfBirth EmpStatus Badge HourlySalary
-- - --------- -------- ---------- ----------- --------- ----- ------------
-- 1 Cheng2 Yu2 NULL 1984-10-14 P 4276 250.00
--
SELECT FirstName, LastName, MiddleName, DateOfBirth,
EmploymentStatus, Badge, HourlySalary
FROM PERSON
LEFT JOIN FULL_TIME ON PERSON.Id = FULL_TIME.Id
LEFT JOIN PART_TIME ON PERSON.Id = PART_TIME.Id
WHERE PERSON.Id = @PersonId;
-- Determine the badge id for the person just added.
DECLARE @BadgeId INT
SELECT @BadgeId = Badge FROM PERSON WHERE Id = @PersonId;
-- Display the name of the person that issued the badge.
-- This returns:
--
-- (No column name)
-- - ----------------
-- 1 Chen, Rue P
--
SELECT dbo.PersonName(IssuingPerson)
FROM BADGE
WHERE Id = @BadgeId;
-- Display the skill names associated with this person.
-- This returns:
--
-- Title (No column name)
-- ---- ----------- ----------------
-- 1 Bilingual Yu, Cheng
--
SELECT Title, dbo.PersonName(PersonId)
FROM SKILL JOIN PERSON_SKILL
ON SKILL.Id = PERSON_SKILL.SkillId
WHERE PERSON_SKILL.PersonId = @PersonId;
-- Remove the person records.
EXECUTE DeletePersonInstance @PersonId
GO
*/