From 4ad6156330777a7f0d015e3242686679be6a2ed3 Mon Sep 17 00:00:00 2001 From: Phlake Date: Wed, 1 Jun 2022 22:45:07 +0300 Subject: [PATCH 1/3] Added lab_7 --- .gitignore | 446 ++++++++++++++++++++++++++++++++++++++++++ db_script.sql | 117 +++++++++++ eer_diagram.mwb | Bin 0 -> 11863 bytes functions.sql | 33 ++++ inserts.sql | 107 ++++++++++ stored_procedures.sql | 142 ++++++++++++++ triggers.sql | 343 ++++++++++++++++++++++++++++++++ 7 files changed, 1188 insertions(+) create mode 100644 .gitignore create mode 100644 db_script.sql create mode 100644 eer_diagram.mwb create mode 100644 functions.sql create mode 100644 inserts.sql create mode 100644 stored_procedures.sql create mode 100644 triggers.sql diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b02d695 --- /dev/null +++ b/.gitignore @@ -0,0 +1,446 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +build/ +bld/ +[Bb]in/ +[Oo]bj/ +out/ + +# Visual Studio 2015 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ +**/Properties/launchSettings.json +# DNX +project.lock.json +artifacts/ + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +# publish/ + +# Publish Web Output +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config + +# Windows Azure Build Output +csx/ +*.build.csdef + +# Windows Store app package directory +AppPackages/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +[Ss]tyle[Cc]op.* +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +*.pfx +*.publishsettings +node_modules/ +orleans.codegen.cs + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Typescript v1 declaration files +typings/ +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +/build +/Build +/deploy +/package +bin/ +obj/ +sql/ +*/obj/debug +**/Debug +#ignore thumbnails created by windows +Thumbs.db +#Ignore files build by Visual Studio +*.obj +*.pdb +*.user +*.aps +*.pch +*.docstates +*.vspscc +*_i.c +*_p.c +*.ncb +*.suo +*.tlb +*.dbmdl +*.schemaview +*.tlh +*.cache +*.ilk +*.log +[Bb]in +[Dd]ebug*/ +*.lib +*.sbr +obj/ +[Rr]elease*/ +_ReSharper*/ +[Tt]est[Rr]esult* +*.docstates +*.swp +*.*~ +*.gpState +*.ReSharper* +*.preflight +*.nocommit +#Ignore Recovery Files made by Excel +~$*.xlsx +*.rdl.data + +*.jfm + +#====================================================================================== +# The below section could possibly be removed as these should be ignored by the above. +#====================================================================================== + +samples/in-memory/ticket-reservations/DemoWorkload/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs +*.nupkg +samples/in-memory/ticket-reservations/packages/CircularGauge.1.0.0/CreatePackageFile.bat +*.suo +samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/bin/Debug/PopulateAlwaysEncryptedData.exe +*.pdb +samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/bin/Debug/PopulateAlwaysEncryptedData.vshost.exe +*.Cache +samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/bin/Debug/PopulateAlwaysEncryptedData.exe.config +samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs +samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/MultithreadedInMemoryTableInsert/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs +*.exe +samples/features/in-memory/iot-smart-grid/ConsoleClient/bin/Release/DataGenerator.dll +samples/features/in-memory/iot-smart-grid/ConsoleClient/bin/Release/Reports/PowerDashboard.pbix +samples/databases/wide-world-importers/wwi-integration-etl/Daily ETL/bin/Development/Daily ETL.ispac +samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/obj/Release/PopulateAlwaysEncryptedData.csproj.FileListAbsolute.txt +samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/bin/Release/PopulateAlwaysEncryptedData.vshost.exe.config +samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/obj/Release/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs +*.dll +samples/features/in-memory/ticket-reservations/DemoWorkload/obj/Release/DemoWorkload.FrmConfig.resources +samples/features/in-memory/ticket-reservations/DemoWorkload/bin/Release/DemoWorkload.vshost.exe.config +samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/obj/Debug/PopulateAlwaysEncryptedData.csproj.FileListAbsolute.txt +samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/bin/Debug/PopulateAlwaysEncryptedData.vshost.exe.config +*.zip +samples/features/in-memory/ticket-reservations/packages/CircularGauge.1.0.0/CreatePackageFile.bat +samples/features/in-memory/ticket-reservations/TicketReservations/TicketReservations.dbmdl +samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/MultithreadedInMemoryTableInsert/obj/Release/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs +samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/MultithreadedInMemoryTableInsert/obj/Debug/MultithreadedInMemoryTableInsert.csproj.FileListAbsolute.txt +samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/obj/Debug/PopulateAlwaysEncryptedData.Properties.Resources.resources +samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/obj/Release/PopulateAlwaysEncryptedData.PopulateAlwaysEncryptedDataMain.resources +samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/bin/Debug/PopulateAlwaysEncryptedData.vshost.exe.manifest +samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/obj/Debug/PopulateAlwaysEncryptedData.PopulateAlwaysEncryptedDataMain.resources +samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/MultithreadedInMemoryTableInsert/obj/Release/MultithreadedInMemoryTableInsert.Properties.Resources.resources +samples/databases/wide-world-importers/sample-scripts/always-encrypted/PopulateAlwaysEncryptedData/obj/Release/PopulateAlwaysEncryptedData.Properties.Resources.resources +samples/features/in-memory/ticket-reservations/packages/CircularGauge.1.0.0/ReadMe.txt +*.dacpac +samples/features/in-memory/ticket-reservations/TicketReservations/obj/Release/Model.xml +samples/features/in-memory/ticket-reservations/DemoWorkload/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs +*.dat + +*.user +samples/features/in-memory/ticket-reservations/DemoWorkload/obj/Release/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs +samples/databases/wide-world-importers/workload-drivers/vehicle-location-insert/MultithreadedInMemoryTableInsert/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs +samples/features/in-memory/ticket-reservations/DemoWorkload/bin/Debug/DemoWorkload.vshost.exe.config +samples/features/in-memory/ticket-reservations/DemoWorkload/obj/Release/DemoWorkload.Properties.Resources.resources +samples/databases/wide-world-importers/wwi-integration-etl/Daily ETL/obj/Development/Project.params +samples/features/in-memory/ticket-reservations/DemoWorkload/obj/Debug/DemoWorkload.csproj.FileListAbsolute.txt +samples/features/in-memory/iot-smart-grid/Db/obj/Release/Model.xml +samples/applications/iot-smart-grid/DataGenerator/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs +samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/bin/Debug/MultithreadedOrderInsert.exe.config +samples/features/in-memory/iot-smart-grid/ConsoleClient/bin/Release/ConsoleClient.exe.config +*.jfm +samples/features/in-memory/ticket-reservations/TicketReservations/bin/Release/TicketReservations.publish.sql +samples/applications/iot-smart-grid/ConsoleClient/bin/Release/ConsoleClient.exe.config +samples/applications/iot-smart-grid/Db/Db.dbmdl +samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/obj/Release/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs +samples/databases/wide-world-importers/wwi-dw-ssdt/wwi-dw-ssdt/obj/Debug/Model.xml +samples/databases/wide-world-importers/wwi-dw-ssdt/wwi-dw-ssdt/WideWorldImportersDW.dbmdl +samples/features/in-memory/iot-smart-grid/WinFormsClient/bin/Release/Reports/PowerDashboard.pbix +samples/databases/wide-world-importers/wwi-ssdt/wwi-ssdt/WideWorldImporters.dbmdl +samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/obj/Debug/TemporaryGeneratedFile_E7A71F73-0F8D-4B9B-B56E-8E70B10BC5D3.cs +samples/databases/wide-world-importers/wwi-ssasmd/wwi-ssasmd/bin/WWI-SSASMD.asdatabase +samples/applications/iot-smart-grid/Db/obj/Release/Db.sqlproj.FileListAbsolute.txt +*.manifest +samples/applications/iot-smart-grid/WinFormsClient/obj/Debug/TemporaryGeneratedFile_036C0B5B-1481-4323-8D20-8F5ADCB23D92.cs +samples/databases/wide-world-importers/wwi-ssasmd/wwi-ssasmd/obj/Development/IncrementalShapshot.xml +samples/applications/iot-smart-grid/ConsoleClient/bin/Release/Reports/PowerDashboard.pbix +samples/applications/iot-smart-grid/Db/obj/Release/Model.xml +samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/obj/Release/MultithreadedOrderInsert.csproj.FileListAbsolute.txt +samples/applications/iot-smart-grid/ConsoleClient/obj/Debug/TemporaryGeneratedFile_5937a670-0e60-4077-877b-f7221da3dda1.cs +samples/applications/iot-smart-grid/WinFormsClient/bin/Release/Client.exe.config +samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/bin/Release/MultithreadedOrderInsert.exe.config +samples/databases/wide-world-importers/workload-drivers/order-insert/MultithreadedOrderInsert/obj/Debug/MultithreadedInMemoryTableInsert.MultithreadedOrderInsertMain.resources +/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyEvaluationErrors.rdl.data +/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyEvaluationErrorDetails.rdl.data +/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyEvaluationDetails.rdl.data +/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyDetails.rdl.data +/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyDashboard.rdl.data +/samples/features/epm-framework/5.0/2Reporting/PolicyReports/bin/Debug +/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyDashboard - Backup.rdl +/samples/features/epm-framework/5.0/2Reporting/PolicyReports/PolicyDashboardFiltered.rdl.data +samples/features/sql-management-objects/src/out/CodeCoverage/CodeCoverage.config + +# Certificates +*.pem +*.p12 + +# Composer +/vendor/ \ No newline at end of file diff --git a/db_script.sql b/db_script.sql new file mode 100644 index 0000000..ef7f6f6 --- /dev/null +++ b/db_script.sql @@ -0,0 +1,117 @@ +CREATE DATABASE IF NOT EXISTS pharmacy_db; +USE pharmacy_db; + +DROP TABLE IF EXISTS pharmaсy_has_medicine; +DROP TABLE IF EXISTS medicine_zone; +DROP TABLE IF EXISTS pharmacy; +DROP TABLE IF EXISTS medicine_list; +DROP TABLE IF EXISTS employee; +DROP TABLE IF EXISTS post; +DROP TABLE IF EXISTS effect_zone; +DROP TABLE IF EXISTS street; + + +-- ------------------------------------------------- -- +-- STREET -- +-- ------------------------------------------------- -- +CREATE TABLE street +( + id INT NOT NULL AUTO_INCREMENT, + name VARCHAR(45) NOT NULL, + PRIMARY KEY (id) +); + +-- ------------------------------------------------- -- +-- EFFECT ZONE -- +-- ------------------------------------------------- -- + +CREATE TABLE effect_zone +( + id INT NOT NULL AUTO_INCREMENT, + name VARCHAR(45) NOT NULL, + PRIMARY KEY (id) +); + +-- ------------------------------------------------- -- +-- POST -- +-- ------------------------------------------------- -- + +CREATE TABLE post +( + id INT NOT NULL AUTO_INCREMENT, + name VARCHAR(25) NOT NULL, + PRIMARY KEY (id) +); + +-- ------------------------------------------------- -- +-- EMPLOYEE -- +-- ------------------------------------------------- -- +CREATE TABLE employee +( + id INT NOT NULL AUTO_INCREMENT, + name VARCHAR(45) NOT NULL, + surname VARCHAR(45) NOT NULL, + middle_name VARCHAR(45) NOT NULL, + identity_number VARCHAR(20) NOT NULL, + passport_data VARCHAR(20) NOT NULL, + experience DECIMAL(10, 1) NOT NULL, + birth_date DATE NOT NULL, + post_id INT NOT NULL, + pharmacy_id INT NOT NULL, + PRIMARY KEY (id) +); + +-- ------------------------------------------------- -- +-- MEDICINE LIST -- +-- ------------------------------------------------- -- + +CREATE TABLE medicine_list +( + id INT NOT NULL AUTO_INCREMENT, + name VARCHAR(20) NOT NULL, + ministry_code VARCHAR(10) NOT NULL, + require_recipe TINYINT NOT NULL, + is_narcotic TINYINT NULL, + is_psychtropic TINYINT NULL, + PRIMARY KEY (id) +); + +-- ------------------------------------------------- -- +-- PHARMACY -- +-- ------------------------------------------------- -- + +CREATE TABLE pharmacy +( + id INT NOT NULL AUTO_INCREMENT, + name VARCHAR(45) NOT NULL, + street_id VARCHAR(45) NOT NULL, + building_number INT NOT NULL, + web_adress VARCHAR(45) NULL, + work_time_open TIME NOT NULL, + work_time_close TIME NOT NULL, + is_open_saturday TINYINT NOT NULL, + is_open_sunday TINYINT NOT NULL, + PRIMARY KEY (id) +); + +-- ------------------------------------------------- -- +-- MEDICINE ZONE -- +-- ------------------------------------------------- -- + +CREATE TABLE medicine_zone +( + medicine_id INT NOT NULL, + zone_id INT NOT NULL, + PRIMARY KEY (medicine_id, zone_id) +); + +-- ------------------------------------------------- -- +-- PHARMASY HAS MEDICINE -- +-- ------------------------------------------------- -- + +CREATE TABLE pharmaсy_has_medicine +( + pharmacy_id INT NOT NULL, + medicine_id INT NOT NULL, + PRIMARY KEY (pharmacy_id, medicine_id) +); diff --git a/eer_diagram.mwb b/eer_diagram.mwb new file mode 100644 index 0000000000000000000000000000000000000000..d9e059e9a15836ebbc92e063b208c673dafc7fee GIT binary patch literal 11863 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 VVfbonVQOpml^0~|ZeoP^zW{4mU-ke1 literal 0 HcmV?d00001 diff --git a/functions.sql b/functions.sql new file mode 100644 index 0000000..0ecab2b --- /dev/null +++ b/functions.sql @@ -0,0 +1,33 @@ +USE pharmacy_db; + +SET GLOBAL log_bin_trust_function_creators = 1; +-- Task №1 для employee шукати AVG стовпця experience. + +DROP FUNCTION IF EXISTS get_avg_working_experience; +DELIMITER // +CREATE FUNCTION get_avg_working_experience() + RETURNS DECIMAL(10, 1) +BEGIN + RETURN (SELECT AVG(experience) + FROM employee); +END // +DELIMITER ; + +# SELECT name, experience +# FROM employee where experience > get_avg_working_experience(); + +-- Task №2 витягує за ключем між street та pharmacy значення поля street.name . +DROP FUNCTION IF EXISTS get_street_name; +DELIMITER // +CREATE FUNCTION get_street_name( + pharmacy_id INT +) + RETURNS VARCHAR(45) +BEGIN + RETURN (SELECT name + FROM street + WHERE id = (SELECT street_id FROM pharmacy WHERE id = pharmacy_id)); +END // +DELIMITER ; + +# select *, get_street_name(pharmacy.id) as street_name from pharmacy; diff --git a/inserts.sql b/inserts.sql new file mode 100644 index 0000000..0e51869 --- /dev/null +++ b/inserts.sql @@ -0,0 +1,107 @@ +USE pharmacy_db; + + +INSERT INTO street (name) +VALUES ('Kvitky-Osnovianenka'), + ('Nyzynna'), + ('Stepanivny'), + ('Shevchenka'), + ('Warszawska'), + ('Armii Ludowej'), + ('Wesela'), + ('Veresneva'), + ('Ochota'), + ('Virmenska'); + +INSERT INTO post (name) +VALUES ('clerk'), + ('dispencer'), + ('assistant'), + ('technician'), + ('pharmacist'), + ('director'), + ('manager'), + ('pharmalogist'); + +INSERT INTO pharmacy (id, name, street_id, building_number, web_adress, work_time_open, + work_time_close, is_open_saturday, is_open_sunday) +VALUES ('1', 'Apteka', '1', '23', 'www.adress.com', '9:00', '18:00', '1', '1'), + ('2', 'biomed', '4', '12', 'www.biomed.ua', '00:00', '00:00', '1', '1'), + ('3', 'aptechka', '8', '1', 'www.apt.com', '10:00', '21:00', '0', '0'), + ('4', 'Znahar', '4', '4', 'www.znahar.org', '6:00', '22:00', '0', '1'), + ('5', 'apt24', '1', '5', 'www.art24.ua', '9:00', '17:00', '0', '0'), + ('6', 'StopAsylum', '7', '32', 'www.stpslm.com', '13:00', '18:00', '1', '0'), + ('7', 'Fight your shyzophrenia', '1', '13', 'www.aptekaforyou.com', '10:00', '16:00', '0', + '1'), + ('8', 'AptekaIot', '4', '21', 'www.iotapteka.com', '8:30', '00:00', '1', '1'), + ('9', 'pharmacy', '3', '1', 'www.pharmacy.ua', '10:00', '17:00', '1', '0'), + ('10', 'drugStore', '2', '42', 'www.drugstore.ua', '9:45', '21:45', '0', '0'); + + +INSERT INTO effect_zone (name) +VALUES ('lungs'), + ('heart'), + ('bones'), + ('neck'), + ('back'), + ('stomach'), + ('liver'), + ('tooth'), + ('eyes'), + ('ears'); + + +INSERT INTO employee (name, surname, middle_name, identity_number, passport_data, experience, + birth_date, post_id, pharmacy_id) +VALUES ('Василь', 'Potter', 'Jamesovich', '1234342674', 'fn 212311', '2 ', '2002-12-12', '1', '1'), + ('Галина', 'Veesley', 'Batkovysh', '1213423100', 'af 190193', '0 ', '2000-11-07', '3', '1'), + ('Галина', 'Granger', 'Jean', '3221213400', 'at 300329', '4 ', '2003-09-15', '5', '4'), + ('Іван', 'Malfoy', 'Lutsiusius', '4233909400', 'gr 302039', '15 ', '1980-07-28', '7', '2'), + ('Василь', 'Snape', 'Forever', '1000000000', 'ui 203902', '12', '1991-09-09', '6', '9'), + ('Іван', 'Andrew', 'Andriiovych', '2329310900', 're 403940', '6.5', '2000-01-01', '4', '3'), + ('Василь', 'Mininkov', 'Maksymovych', '9999999999', 'ps 133722', '9', '2003-05-15', '6', + '6'), + ('Іван', 'Shevchenko', 'Hryhorovych', '2930293092', 'rt 394939', '13', '1840-03-09', '8', + '8'), + ('Василь', 'Franko', 'Yakovych', '3209302940', 'po 093094', '5', '1876-05-07', '2', '4'), + ('Олександра', 'Ukrainka', 'Petrivna', '2930290392', 'uy 309403', '4', '1856-08-27', '3', + '1'); + + +INSERT INTO medicine_list (name, ministry_code, require_recipe, is_narcotic, is_psychtropic) +VALUES ('Nimesyl', '324', '1', '0', '0'), + ('Mefenaminka', '789', '0', '0', '0'), + ('Aspiryn', '123', '0', '0', '0'), + ('Viks', '324', '0', '0', '0'), + ('Ibuprom', '789', '0', '0', '1'), + ('Kanefron', '176', '1', '0', '0'), + ('Vitamin C', '300', '0', '0', '0'), + ('Hlicysed', '993', '0', '1', '0'), + ('NervoNorm', '993', '1', '0', '1'), + ('Tamipul', '346', '0', '0', '0'); + + +INSERT INTO pharmaсy_has_medicine (pharmacy_id, medicine_id) +VALUES (1, 3), + (3, 2), + (6, 6), + (1, 7), + (2, 5), + (3, 8), + (4, 4), + (10, 10), + (8, 1), + (7, 6); + + +INSERT INTO medicine_zone (medicine_id, zone_id) +VALUES (1, 3), + (2, 5), + (3, 4), + (5, 1), + (7, 2), + (10, 4), + (4, 6), + (6, 7), + (9, 2), + (3, 8); diff --git a/stored_procedures.sql b/stored_procedures.sql new file mode 100644 index 0000000..56320e5 --- /dev/null +++ b/stored_procedures.sql @@ -0,0 +1,142 @@ +USE pharmacy_db; +-- параметризована вставка в співробітники. +DROP PROCEDURE IF EXISTS insert_into_employee; +DELIMITER // +CREATE PROCEDURE insert_into_employee( + name VARCHAR(45), + surname VARCHAR(45), + middle_name VARCHAR(45), + identity_number VARCHAR(20), + passport_data VARCHAR(20), + experience DECIMAL(10, 1), + birth_date DATE, + post_id INT, + pharmacy_id INT +) +BEGIN + INSERT INTO employee(name, surname, middle_name, identity_number, passport_data, experience, + birth_date, post_id, pharmacy_id) + VALUES (name, surname, middle_name, identity_number, passport_data, experience, birth_date, + post_id, pharmacy_id); +END // +DELIMITER ; + +# call insert_into_employee('s','d','a','v','a','1','2022-01-01','8','9'); +-- 2. +DROP PROCEDURE IF EXISTS insert_street; +DELIMITER // +CREATE PROCEDURE insert_street() +BEGIN + DECLARE completed_name VARCHAR(10); + DECLARE sample_name VARCHAR(10) DEFAULT ('Noname'); + DECLARE num INT DEFAULT (0); + DECLARE i INT DEFAULT (0); + WHILE i < 10 + DO + SET num = FLOOR(RAND() * 10); + WHILE (SELECT name FROM street WHERE name = CONCAT(sample_name, num)) = + CONCAT(sample_name, num) + DO + SET num = FLOOR(RAND() * 10); + END WHILE; + SET completed_name = CONCAT(sample_name, num); + INSERT INTO street(name) VALUES (completed_name); + SET i = i + 1; + END WHILE; + SELECT * FROM street; +END // +DELIMITER ; + +# call insert_street(); +-- 2 +DROP PROCEDURE IF EXISTS insert_medicine_zone; +DELIMITER // +CREATE PROCEDURE insert_medicine_zone( + medicine_id INT, + zone_id INT +) +BEGIN + IF (SELECT id FROM medicine_list WHERE id = medicine_id) + AND (SELECT id FROM effect_zone WHERE id = zone_id) + THEN + INSERT INTO medicine_zone(medicine_id, zone_id) VALUES (medicine_id, zone_id); + END IF; +END // +DELIMITER ; + + +-- 3 курсор. + +DROP PROCEDURE IF EXISTS pharmacy_create_names; +DELIMITER // +CREATE PROCEDURE pharmacy_create_names() +BEGIN + DECLARE done BOOL DEFAULT FALSE; + DECLARE newer_name VARCHAR(45); + DECLARE name_cursor CURSOR + FOR SELECT name FROM pharmacy; + DECLARE CONTINUE HANDLER + FOR NOT FOUND SET done = TRUE; + OPEN name_cursor; + names_loop: + LOOP + FETCH name_cursor INTO newer_name; + IF done THEN + LEAVE names_loop; + END IF; + + SET @new_table = + 'CREATE TABLE IF NOT EXISTS pharmacy_names ( id INT NOT NULL AUTO_INCREMENT, name VARCHAR(45), PRIMARY KEY(id));'; + SELECT @new_table; + PREPARE new_table_query FROM @new_table; + EXECUTE new_table_query; + INSERT INTO pharmacy_names (name) VALUES (newer_name); + + END LOOP; + CLOSE name_cursor; +END // +DELIMITER ; + +# call pharmacy_create_names(); +-- 3 курсор + +DROP PROCEDURE IF EXISTS employee_create_db; +DELIMITER // +CREATE PROCEDURE employee_create_db() +BEGIN + DECLARE done BOOL DEFAULT FALSE; + DECLARE new_name VARCHAR(45); + DECLARE new_surname VARCHAR(45); + DECLARE surnames CURSOR + FOR SELECT name, surname FROM employee; + DECLARE CONTINUE HANDLER + FOR NOT FOUND SET done = TRUE; + OPEN surnames; + names_loop: + LOOP + FETCH surnames INTO new_name, new_surname; + IF done THEN + LEAVE names_loop; + END IF; + + SET @employee_db := CONCAT('CREATE DATABASE IF NOT EXISTS ', new_name, new_surname, ';'); + PREPARE query FROM @employee_db; + EXECUTE query; + SET @table_count := 1; + + WHILE @table_count < RAND() * 4 + DO + SET @new_table = + CONCAT('CREATE TABLE IF NOT EXISTS ', new_name, new_surname, '.', new_name, + new_surname, @table_count, + '( id INT, name VARCHAR(45), surname VARCHAR(45));'); + SELECT @new_table; + PREPARE new_table_query FROM @new_table; + EXECUTE new_table_query; + SET @table_count = @table_count + 1; + END WHILE; + + END LOOP; + CLOSE surnames; +END // +DELIMITER ; diff --git a/triggers.sql b/triggers.sql new file mode 100644 index 0000000..9c78b71 --- /dev/null +++ b/triggers.sql @@ -0,0 +1,343 @@ +USE pharmacy_db; +-- №1: забезпечити цілісність даних. + + +-- POST +DROP TRIGGER IF EXISTS post_update; + +DELIMITER // +CREATE TRIGGER post_update + BEFORE UPDATE + ON post + FOR EACH ROW +BEGIN + IF (new.id != old.id AND old.id IN (SELECT id FROM post)) THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'no such data found'; + END IF; +END // +DELIMITER ; + +DROP TRIGGER IF EXISTS post_delete; +DELIMITER // +CREATE TRIGGER post_delete + BEFORE DELETE + ON post + FOR EACH ROW +BEGIN + IF (old.id IN (SELECT post_id FROM employee)) THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'there is at least one person with such data, you cannot delete it'; + END IF; +END // +DELIMITER ; + + +-- EFFECT ZONE + + +DROP TRIGGER IF EXISTS effect_zone_update; +DELIMITER // +CREATE TRIGGER effect_zone_update + BEFORE UPDATE + ON effect_zone + FOR EACH ROW +BEGIN + IF (new.id != old.id AND old.id IN (SELECT id FROM effect_zone)) THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'no such data found'; + END IF; +END // +DELIMITER ; + +DROP TRIGGER IF EXISTS effect_zone_delete; +DELIMITER // +CREATE TRIGGER effect_zone_delete + BEFORE DELETE + ON effect_zone + FOR EACH ROW +BEGIN + IF (old.id IN (SELECT zone_id FROM medicine_zone)) THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'there is at least one person with such data, you cannot delete it'; + END IF; +END // +DELIMITER ; + +-- STREET +DROP TRIGGER IF EXISTS street_update; +DELIMITER // +CREATE TRIGGER street_update + BEFORE UPDATE + ON street + FOR EACH ROW +BEGIN + IF (new.id != old.id AND old.id IN (SELECT id FROM street)) THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'no such data found'; + END IF; +END // +DELIMITER ; + +DROP TRIGGER IF EXISTS street_delete; +DELIMITER // +CREATE TRIGGER street_delete + BEFORE DELETE + ON street + FOR EACH ROW +BEGIN + IF (old.id IN (SELECT street_id FROM pharmacy)) THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'there is at least one person with such data, you cannot delete it'; + END IF; +END // +DELIMITER ; + + +-- MEDICINE LIST +DROP TRIGGER IF EXISTS medicine_update; +DELIMITER // +CREATE TRIGGER medicine_update + BEFORE UPDATE + ON medicine_list + FOR EACH ROW +BEGIN + IF (new.id != old.id AND old.id IN (SELECT id FROM medicine_list)) THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'no such data found'; + END IF; + + +END // +DELIMITER ; + + +DROP TRIGGER IF EXISTS medicine_delete; +DELIMITER // +CREATE TRIGGER medicine_delete + BEFORE DELETE + ON medicine_list + FOR EACH ROW +BEGIN + IF (old.id IN (SELECT medicine_id FROM medicine_zone)) THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'there is at least one person with such data, you cannot delete it'; + END IF; + IF (old.id IN (SELECT medicine_id FROM pharmaсy_has_medicine)) THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'there is at least one person with such data, you cannot delete it'; + END IF; +END // +DELIMITER ; + + +-- Employee +DROP TRIGGER IF EXISTS employee_insert; + +DELIMITER // +CREATE TRIGGER employee_insert + BEFORE INSERT + ON employee + FOR EACH ROW +BEGIN + IF (new.post_id NOT IN (SELECT id FROM post)) THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'FK error. no such data found'; + END IF; + IF (new.pharmacy_id NOT IN (SELECT id FROM pharmacy)) THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'FK error. no such data found'; + END IF; +END// +DELIMITER ; + +DROP TRIGGER IF EXISTS employee_update; + +DELIMITER // +CREATE TRIGGER employee_update + BEFORE UPDATE + ON employee + FOR EACH ROW +BEGIN + IF (new.id != old.id AND old.id IN (SELECT id FROM employee)) THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'no such data found'; + END IF; +END// +DELIMITER ; + + +-- Pharmacy + +DROP TRIGGER IF EXISTS pharmacy_insert; + +DELIMITER // +CREATE TRIGGER pharmacy_insert + BEFORE INSERT + ON pharmacy + FOR EACH ROW +BEGIN + IF (new.street_id NOT IN (SELECT id FROM street)) THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'FK error. no such data found'; + END IF; + +END// +DELIMITER ; + +DROP TRIGGER IF EXISTS pharmacy_update; +DELIMITER // +CREATE TRIGGER pharmacy_update + BEFORE UPDATE + ON pharmacy + FOR EACH ROW +BEGIN + IF (new.id != old.id AND old.id IN (SELECT id FROM pharmacy)) THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'no such data found'; + END IF; +END// +DELIMITER ; + +DROP TRIGGER IF EXISTS pharmacy_delete; +DELIMITER // +CREATE TRIGGER pharmacy_delete + BEFORE DELETE + ON pharmacy + FOR EACH ROW +BEGIN + IF (old.id IN (SELECT pharmacy_id FROM pharmaсy_has_medicine)) THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'there is at least one person with such data, you cannot delete it'; + END IF; +END // +DELIMITER ; + +-- Medicine ZONE + +DROP TRIGGER IF EXISTS medicine_zone_insert; +DELIMITER // +CREATE TRIGGER medicine_zone_insert + BEFORE INSERT + ON medicine_zone + FOR EACH ROW +BEGIN + IF (new.medicine_id NOT IN (SELECT id FROM medicine_list)) THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'FK error. no such data found'; + END IF; + IF (new.zone_id NOT IN (SELECT id FROM effect_zone)) THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'FK error. no such data found'; + END IF; +END +// DELIMITER ; + +DROP TRIGGER IF EXISTS medicine_zone_update; +DELIMITER // +CREATE TRIGGER medicine_zone_update + BEFORE UPDATE + ON medicine_zone + FOR EACH ROW +BEGIN + IF (new.medicine_id != old.medicine_id AND + old.medicine_id IN (SELECT medicine_id FROM medicine_zone)) THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'no such link in the linking table'; + END IF; + IF (new.zone_id != old.zone_id AND old.zone_id IN (SELECT zone_id FROM medicine_zone)) THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'no such link in the linking table'; + END IF; + +END +// DELIMITER ; + + +-- pharmacy has medicine + +DROP TRIGGER IF EXISTS pharmacy_has_medicine_insert; +DELIMITER // +CREATE TRIGGER pharmacy_has_medicine_insert + BEFORE INSERT + ON pharmaсy_has_medicine + FOR EACH ROW +BEGIN + IF (new.medicine_id NOT IN (SELECT id FROM medicine_list)) THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'FK error. no such data found'; + END IF; + IF (new.pharmacy_id NOT IN (SELECT id FROM pharmacy)) THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'FK error. no such data found'; + END IF; +END +// DELIMITER ; + +DROP TRIGGER IF EXISTS pharmacy_has_medicine_update; +DELIMITER // +CREATE TRIGGER pharmacy_has_medicine_update + BEFORE UPDATE + ON pharmaсy_has_medicine + FOR EACH ROW +BEGIN + IF (new.pharmacy_id != old.pharmacy_id AND + old.pharmacy_id IN (SELECT pharmacy_id FROM pharmaсy_has_medicine)) THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'no such link in the linking table'; + END IF; + IF (new.medicine_id != old.medicine_id AND + old.medicine_id IN (SELECT medicine_id FROM pharmaсy_has_medicine)) THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'no such link in the linking table'; + END IF; +END +// DELIMITER ; + +-- 2. +DROP TRIGGER IF EXISTS passport_data_format; +DELIMITER // +CREATE TRIGGER passport_data_format + BEFORE INSERT + ON employee + FOR EACH ROW +BEGIN + IF (new.passport_data NOT RLIKE '.. [0-9]{6}') THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'passport data does not match provided pattern!'; + END IF; +END +// +DELIMITER ; + +-- 3. +DROP TRIGGER IF EXISTS name_format; +DELIMITER // +CREATE TRIGGER name_format + BEFORE INSERT + ON employee + FOR EACH ROW +BEGIN + IF (new.name NOT RLIKE 'Василь|Іван|Галина|Олександра') THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'name does not match provided pattern!'; + END IF; +END +// +DELIMITER ; + + +-- 4. +DROP TRIGGER IF EXISTS ban_delete_on_street; +DELIMITER // +CREATE TRIGGER ban_delete_on_street + BEFORE DELETE + ON street + FOR EACH ROW +BEGIN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'you cannot delete data on this table!'; +END // +DELIMITER ; + +# DELETE street from street where id = 9; From 2a675d2f0a2adb2a34c6896684e660626c02b533 Mon Sep 17 00:00:00 2001 From: Phlake Date: Wed, 15 Jun 2022 18:34:26 +0300 Subject: [PATCH 2/3] Update .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index b02d695..17e71b8 100644 --- a/.gitignore +++ b/.gitignore @@ -22,6 +22,7 @@ bld/ [Bb]in/ [Oo]bj/ out/ +target/ # Visual Studio 2015 cache/options directory .vs/ From d17028eef960b4cd3bf131560ef9ac4de453d1ca Mon Sep 17 00:00:00 2001 From: Phlake Date: Fri, 17 Jun 2022 13:53:38 +0300 Subject: [PATCH 3/3] minor changes --- README.md | 1 + stored_procedures.sql | 61 ++----------------------------------- triggers.sql | 70 +++++++++++++++++++++++++++---------------- 3 files changed, 48 insertions(+), 84 deletions(-) diff --git a/README.md b/README.md index 681d633..77424ef 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,3 @@ # Databases + Variant 11 diff --git a/stored_procedures.sql b/stored_procedures.sql index 56320e5..d9c7680 100644 --- a/stored_procedures.sql +++ b/stored_procedures.sql @@ -48,22 +48,6 @@ END // DELIMITER ; # call insert_street(); --- 2 -DROP PROCEDURE IF EXISTS insert_medicine_zone; -DELIMITER // -CREATE PROCEDURE insert_medicine_zone( - medicine_id INT, - zone_id INT -) -BEGIN - IF (SELECT id FROM medicine_list WHERE id = medicine_id) - AND (SELECT id FROM effect_zone WHERE id = zone_id) - THEN - INSERT INTO medicine_zone(medicine_id, zone_id) VALUES (medicine_id, zone_id); - END IF; -END // -DELIMITER ; - -- 3 курсор. @@ -97,46 +81,5 @@ BEGIN END // DELIMITER ; -# call pharmacy_create_names(); --- 3 курсор - -DROP PROCEDURE IF EXISTS employee_create_db; -DELIMITER // -CREATE PROCEDURE employee_create_db() -BEGIN - DECLARE done BOOL DEFAULT FALSE; - DECLARE new_name VARCHAR(45); - DECLARE new_surname VARCHAR(45); - DECLARE surnames CURSOR - FOR SELECT name, surname FROM employee; - DECLARE CONTINUE HANDLER - FOR NOT FOUND SET done = TRUE; - OPEN surnames; - names_loop: - LOOP - FETCH surnames INTO new_name, new_surname; - IF done THEN - LEAVE names_loop; - END IF; - - SET @employee_db := CONCAT('CREATE DATABASE IF NOT EXISTS ', new_name, new_surname, ';'); - PREPARE query FROM @employee_db; - EXECUTE query; - SET @table_count := 1; - - WHILE @table_count < RAND() * 4 - DO - SET @new_table = - CONCAT('CREATE TABLE IF NOT EXISTS ', new_name, new_surname, '.', new_name, - new_surname, @table_count, - '( id INT, name VARCHAR(45), surname VARCHAR(45));'); - SELECT @new_table; - PREPARE new_table_query FROM @new_table; - EXECUTE new_table_query; - SET @table_count = @table_count + 1; - END WHILE; - - END LOOP; - CLOSE surnames; -END // -DELIMITER ; +# DROP TABLE IF EXISTS pharmacy_names; +# CALL pharmacy_create_names(); diff --git a/triggers.sql b/triggers.sql index 9c78b71..fa30f59 100644 --- a/triggers.sql +++ b/triggers.sql @@ -11,9 +11,13 @@ CREATE TRIGGER post_update ON post FOR EACH ROW BEGIN - IF (new.id != old.id AND old.id IN (SELECT id FROM post)) THEN + IF (old.id IN (SELECT post_id FROM employee)) THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'cannot change linked entities'; + END IF; + IF (new.id != old.id) THEN SIGNAL SQLSTATE '45000' - SET MESSAGE_TEXT = 'no such data found'; + SET MESSAGE_TEXT = 'id is not same'; END IF; END // DELIMITER ; @@ -33,7 +37,7 @@ END // DELIMITER ; --- EFFECT ZONE +-- EFFECT ZONE DROP TRIGGER IF EXISTS effect_zone_update; @@ -43,12 +47,17 @@ CREATE TRIGGER effect_zone_update ON effect_zone FOR EACH ROW BEGIN - IF (new.id != old.id AND old.id IN (SELECT id FROM effect_zone)) THEN + IF (old.id IN (SELECT zone_id FROM medicine_zone)) THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'cannot change linked entities'; + END IF; + IF (new.id != old.id) THEN SIGNAL SQLSTATE '45000' - SET MESSAGE_TEXT = 'no such data found'; + SET MESSAGE_TEXT = 'id is not same'; END IF; END // DELIMITER ; +# UPDATE effect_zone SET id = 16,name = 'Jojo' WHERE id = 3; DROP TRIGGER IF EXISTS effect_zone_delete; DELIMITER // @@ -72,9 +81,13 @@ CREATE TRIGGER street_update ON street FOR EACH ROW BEGIN - IF (new.id != old.id AND old.id IN (SELECT id FROM street)) THEN + IF (old.id IN (SELECT street_id FROM pharmacy)) THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'cannot change linked entities'; + END IF; + IF (new.id != old.id) THEN SIGNAL SQLSTATE '45000' - SET MESSAGE_TEXT = 'no such data found'; + SET MESSAGE_TEXT = 'id is not same'; END IF; END // DELIMITER ; @@ -102,9 +115,14 @@ CREATE TRIGGER medicine_update ON medicine_list FOR EACH ROW BEGIN - IF (new.id != old.id AND old.id IN (SELECT id FROM medicine_list)) THEN + IF (old.id IN (SELECT medicine_id FROM medicine_zone) + OR old.id IN (SELECT medicine_id FROM pharmaсy_has_medicine)) THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'cannot change linked entities'; + END IF; + IF (new.id != old.id) THEN SIGNAL SQLSTATE '45000' - SET MESSAGE_TEXT = 'no such data found'; + SET MESSAGE_TEXT = 'id is not same'; END IF; @@ -159,15 +177,15 @@ CREATE TRIGGER employee_update ON employee FOR EACH ROW BEGIN - IF (new.id != old.id AND old.id IN (SELECT id FROM employee)) THEN + IF (new.id != old.id) THEN SIGNAL SQLSTATE '45000' - SET MESSAGE_TEXT = 'no such data found'; + SET MESSAGE_TEXT = 'id is not same'; END IF; END// DELIMITER ; --- Pharmacy +-- Pharmacy DROP TRIGGER IF EXISTS pharmacy_insert; @@ -192,9 +210,14 @@ CREATE TRIGGER pharmacy_update ON pharmacy FOR EACH ROW BEGIN - IF (new.id != old.id AND old.id IN (SELECT id FROM pharmacy)) THEN + IF (old.id IN (SELECT pharmacy_id FROM employee) + OR old.id IN (SELECT pharmacy_id FROM pharmaсy_has_medicine)) THEN + SIGNAL SQLSTATE '45000' + SET MESSAGE_TEXT = 'cannot change linked entities'; + END IF; + IF (new.id != old.id) THEN SIGNAL SQLSTATE '45000' - SET MESSAGE_TEXT = 'no such data found'; + SET MESSAGE_TEXT = 'id is not same'; END IF; END// DELIMITER ; @@ -240,19 +263,18 @@ CREATE TRIGGER medicine_zone_update ON medicine_zone FOR EACH ROW BEGIN - IF (new.medicine_id != old.medicine_id AND - old.medicine_id IN (SELECT medicine_id FROM medicine_zone)) THEN + IF (new.medicine_id NOT IN (SELECT id FROM medicine_list)) THEN SIGNAL SQLSTATE '45000' - SET MESSAGE_TEXT = 'no such link in the linking table'; + SET MESSAGE_TEXT = 'no such medicine_list found'; END IF; - IF (new.zone_id != old.zone_id AND old.zone_id IN (SELECT zone_id FROM medicine_zone)) THEN + IF (new.zone_id NOT IN (SELECT id FROM effect_zone)) THEN SIGNAL SQLSTATE '45000' - SET MESSAGE_TEXT = 'no such link in the linking table'; + SET MESSAGE_TEXT = 'no such new effect_zone found'; END IF; END // DELIMITER ; - +# UPDATE medicine_zone SET medicine_id = 110, zone_id = 6 WHERE medicine_id = 7 AND zone_id = 2; -- pharmacy has medicine @@ -281,13 +303,11 @@ CREATE TRIGGER pharmacy_has_medicine_update ON pharmaсy_has_medicine FOR EACH ROW BEGIN - IF (new.pharmacy_id != old.pharmacy_id AND - old.pharmacy_id IN (SELECT pharmacy_id FROM pharmaсy_has_medicine)) THEN + IF (new.pharmacy_id NOT IN (SELECT id FROM pharmacy)) THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'no such link in the linking table'; END IF; - IF (new.medicine_id != old.medicine_id AND - old.medicine_id IN (SELECT medicine_id FROM pharmaсy_has_medicine)) THEN + IF (new.medicine_id NOT IN (SELECT id FROM medicine_list)) THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'no such link in the linking table'; END IF; @@ -302,7 +322,7 @@ CREATE TRIGGER passport_data_format ON employee FOR EACH ROW BEGIN - IF (new.passport_data NOT RLIKE '.. [0-9]{6}') THEN + IF (new.passport_data NOT RLIKE '[a-zA-Z]{2} [0-9]{6}') THEN SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'passport data does not match provided pattern!'; END IF;