School Commit Init

This commit is contained in:
2024-08-31 12:07:21 +03:00
commit 0b130ee18c
2801 changed files with 4720552 additions and 0 deletions
@@ -0,0 +1,218 @@
-- Write SQL scripts that:
-- a. modify the type of a column;
-- b. add / remove a column;
-- c. add / remove a DEFAULT constraint;
-- d. add / remove a primary key;
-- e. add / remove a candidate key;
-- f. add / remove a foreign key;
-- g. create / drop a table.
-- For each of the scripts above, write another one that reverts the operation. Place each script in a stored procedure. Use a simple, intuitive naming convention.
-- a. modify the type of a column;
CREATE PROCEDURE setNameToVarChar100
AS
BEGIN
ALTER TABLE Decks
ALTER COLUMN name VARCHAR(100)
END
GO
CREATE PROCEDURE setNameToVarChar255
AS
BEGIN
ALTER TABLE Decks
ALTER COLUMN name VARCHAR(255)
END
GO
-- b. add / remove a column;
CREATE PROCEDURE addColumnDescription
AS
BEGIN
ALTER TABLE Decks
ADD description VARCHAR(255)
END
GO
CREATE PROCEDURE removeColumnDescription
AS
BEGIN
ALTER TABLE Decks
DROP COLUMN description
END
GO
-- c. add / remove a DEFAULT constraint;
CREATE PROCEDURE addDefaultToDescription
AS
BEGIN
ALTER TABLE Decks
ADD CONSTRAINT DF_Decks_description DEFAULT 'No description' FOR description
END
GO
CREATE PROCEDURE removeDefaultFromDescription
AS
BEGIN
ALTER TABLE Decks
DROP CONSTRAINT DF_Decks_description
END
GO
-- d. add / remove a primary key;
CREATE PROCEDURE removePrimaryKeyFromJournalProgress
AS
BEGIN
ALTER TABLE JourneyProgress
DROP CONSTRAINT PK__JourneyP__2FA1EA2E0A91C8BD
END
GO
CREATE PROCEDURE addPrimaryKeyToJournalProgress
AS
BEGIN
ALTER TABLE JourneyProgress
ADD CONSTRAINT PK__JourneyP__2FA1EA2E0A91C8BD PRIMARY KEY(hJourney, hPlayer)
END
GO
-- e. add / remove a candidate key;
CREATE PROCEDURE addCandidateKeyToDecks
AS
BEGIN
ALTER TABLE Decks
ADD CONSTRAINT CK_Decks_name UNIQUE(name)
END
GO
CREATE PROCEDURE removeCandidateKeyFromDecks
AS
BEGIN
ALTER TABLE Decks
DROP CONSTRAINT CK_Decks_name
END
GO
-- f. add / remove a foreign key;
CREATE PROCEDURE removeForeignKeyFromJourneyProgress
AS
BEGIN
ALTER TABLE JourneyProgress
DROP CONSTRAINT FK__JourneyPr__hPlay__031C6FA4
END
GO
CREATE PROCEDURE addForeignKeyToJourneyProgress
AS
BEGIN
ALTER TABLE JourneyProgress
ADD CONSTRAINT FK__JourneyPr__hPlay__031C6FA4 FOREIGN KEY(hPlayer) REFERENCES Players(hmy)
END
GO
-- g. create / drop a table.
CREATE PROCEDURE createTableSkillTree
AS
BEGIN
CREATE TABLE SkillTree(
hmy INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
name VARCHAR(255) NOT NULL,
description VARCHAR(8000) NOT NULL,
hFaction INT NOT NULL references Factions(hmy),
hPlayer INT NOT NULL references Players(hmy),
)
END
GO
CREATE PROCEDURE dropTableSkillTree
AS
BEGIN
DROP TABLE SkillTree
END
GO
CREATE TABLE versionTable(
version INT NOT NULL
)
CREATE TABLE proceduresTable(
fromVersion INT NOT NULL,
toVersion INT NOT NULL,
procedureName VARCHAR(255) NOT NULL
PRIMARY KEY(fromVersion, toVersion)
)
INSERT INTO versionTable(version) VALUES(1)
INSERT INTO proceduresTable(fromVersion, toVersion, procedureName)
VALUES
(1, 2, 'setNameToVarChar100'),
(2, 1, 'setNameToVarChar255'),
(2, 3, 'addColumnDescription'),
(3, 2, 'removeColumnDescription'),
(3, 4, 'addDefaultToDescription'),
(4, 3, 'removeDefaultFromDescription'),
(4, 5, 'removePrimaryKeyFromJournalProgress'),
(5, 4, 'addPrimaryKeyToJournalProgress'),
(5, 6, 'addCandidateKeyToDecks'),
(6, 5, 'removeCandidateKeyFromDecks'),
(6, 7, 'removeForeignKeyFromJourneyProgress'),
(7, 6, 'addForeignKeyToJourneyProgress'),
(7, 8, 'createTableSkillTree'),
(8, 7, 'dropTableSkillTree')
GO
CREATE PROCEDURE VersionSelector(@newVersion int)
AS
BEGIN TRANSACTION versionControl
BEGIN TRY
DECLARE @currentVersion int
DECLARE @procedureName VARCHAR(255)
SET @currentVersion = (SELECT version FROM versionTable)
IF @newVersion > (SELECT MAX(toVersion) FROM proceduresTable)
RAISERROR('Invalid version', 16, 1)
IF @newVersion < (SELECT MIN(toVersion) FROM proceduresTable)
RAISERROR('Invalid version', 16, 1)
WHILE @currentVersion > @newVersion
BEGIN
SET @procedureName = (SELECT procedureName FROM proceduresTable WHERE fromVersion = @currentVersion AND toVersion = @currentVersion - 1)
EXEC @procedureName
SET @currentVersion = @currentVersion - 1
END
WHILE @currentVersion < @newVersion
BEGIN
SET @procedureName = (SELECT procedureName FROM proceduresTable WHERE fromVersion = @currentVersion AND toVersion = @currentVersion + 1)
EXEC @procedureName
SET @currentVersion = @currentVersion + 1
END
UPDATE versionTable SET version = @newVersion
COMMIT TRANSACTION versionControl
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION versionControl
PRINT ERROR_PROCEDURE()
PRINT ERROR_MESSAGE()
END CATCH
EXECUTE VersionSelector 1