# mysql -u root -p -h localhost
DROP database IF EXISTS SecureStore;
CREATE DATABASE SecureStore;
USE SecureStore;
CREATE TABLE ProductSubCategory (
ProdSubId INT NOT NULL AUTO_INCREMENT,
ProdSubCat VARCHAR(64) NOT NULL,
ProdSubName VARCHAR(64) NOT NULL,
PRIMARY KEY (ProdSubId, ProdSubCat)
);
CREATE TABLE City (
CityId INT NOT NULL AUTO_INCREMENT,
CityName VARCHAR(64) NOT NULL UNIQUE,
PostalCode INT(10) UNSIGNED NOT NULL UNIQUE,
PRIMARY KEY (CityId)
);
CREATE TABLE Product (
ProductId INT NOT NULL AUTO_INCREMENT,
ProductSubCategory VARCHAR(64) NOT NULL,
Cost FLOAT UNSIGNED NOT NULL,
Size VARCHAR(64) NOT NULL,
Color VARCHAR(64) NOT NULL,
Price FLOAT UNSIGNED NOT NULL,
PRIMARY KEY (ProductId),
CONSTRAINT fk_product_id_cat
FOREIGN KEY (ProductId, ProductSubCategory) REFERENCES ProductSubCategory(ProdSubId, ProdSubCat)
ON DELETE RESTRICT
ON UPDATE CASCADE
);
CREATE TABLE Customer (
CustId INT NOT NULL AUTO_INCREMENT,
CustCityId INT NOT NULL,
FirstName VARCHAR(64) NOT NULL,
LastName VARCHAR(64) NOT NULL,
Phone VARCHAR(64) NOT NULL,
Address VARCHAR(128) NOT NULL,
PRIMARY KEY (CustId),
CONSTRAINT fk_custcity_id
FOREIGN KEY (CustCityId) REFERENCES City (CityId)
ON DELETE RESTRICT
ON UPDATE CASCADE
);
CREATE TABLE Store (
StoreId INT NOT NULL AUTO_INCREMENT,
StoreCityId INT NOT NULL,
StoreName VARCHAR(64) NOT NULL,
Phone VARCHAR(64) NOT NULL,
PRIMARY KEY (StoreId),
CONSTRAINT fk_storecity_id
FOREIGN KEY (StoreCityId) REFERENCES City (CityId)
ON DELETE RESTRICT
ON UPDATE CASCADE
);
CREATE TABLE SalesPerson (
SalesPersonId INT NOT NULL,
SalesPersonStoreId INT NOT NULL,
SalesFirstName VARCHAR(64) NOT NULL,
SalesLastName VARCHAR(64) NOT NULL,
PRIMARY KEY (SalesPersonId),
CONSTRAINT fk_salespersonstore_id
FOREIGN KEY (SalesPersonStoreId) REFERENCES Store (StoreId)
ON DELETE RESTRICT
ON UPDATE CASCADE
);
CREATE TABLE FactSales (
SalesPersonId INT NOT NULL,
ProductId INT NOT NULL,
Quantity INT NOT NULL,
OrderDateDay INT NOT NULL,
OrderDateMonth INT NOT NULL,
OrderDateYear INT NOT NULL,
PRIMARY KEY (SalesPersonId, ProductId),
CONSTRAINT fk_salesperson_id
FOREIGN KEY (SalesPersonId) REFERENCES SalesPerson (SalesPersonId)
ON DELETE RESTRICT
ON UPDATE CASCADE,
CONSTRAINT fk_product_id2
FOREIGN KEY (ProductId) REFERENCES Product (ProductId)
ON DELETE RESTRICT
ON UPDATE CASCADE,
CHECK (OrderDateDay BETWEEN 1 and 31),
CHECK (OrderDateMonth BETWEEN 1 and 12),
CHECK (OrderDateYear >= 1970)
);
CREATE TABLE Date (
DayOfWeek VARCHAR(64) NOT NULL,
DayOfMonth INT NOT NULL,
Month INT NOT NULL,
Year INT NOT NULL,
CHECK (DayOfWeek in ('Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday')),
CHECK (DayOfMonth BETWEEN 1 AND 31) ,
CHECK (Month BETWEEN 1 and 12),
Check (Year >= 1970)
);
-- Following the principle of least principle, every account is given write access only to specific tables of the database.
-- They are also given read (select) access on all other tables, since a more detailed access control policy was not taken into account.
-- The Sales manager needs to have read access the Customer, SalesPerson and FactSales table.
CREATE ROLE SalesManager;
GRANT SELECT ON SecureStore.* to SalesManager;
GRANT ALL ON SecureStore.Customer to SalesManage;
GRANT ALL ON SecureStore.SalesPerson to SalesManager;
GRANT ALL ON SecureStore.FactSales to SalesManager;
-- The Product Manager needs to have access on the Product related tables.
CREATE ROLE ProductManager;
GRANT SELECT ON SecureStore.* to ProductManager;
GRANT ALL ON SecureStore.Product to ProductManager ;
GRANT ALL ON SecureStore.ProductSubCategory to ProductManager;
CREATE user nick;
GRANT SalesManager to nick;
CREATE user john;
GRANT ProductManager to john;
-- Login as nick:
mysql -u nick
show databases; -- should show only information_schema
SELECT current_role; -- should be null
SET role ProductManager; -- should fail
SET role SalesManager; -- successful
show databases; -- SecureStore database appears
use SecureStore;
-- Nick has write access to Customer/SalesPerson/FactSales and read access to everything
-- Similar scenario for john as a product manager.
Comments