Ограничения целостности данных и их реализация Термины безопасность и целостность данных в базах данных используются практически всегда совместно, хотя для данных это разные понятия. Термин безопасность относится к защите данных от несанкционированного доступа, изменение или разрушение данных, а понятие целостности к точности или неточности хранимых данных. Под понятием безопасности определяется, что пользователю разрешается выполнить какие-либо действия над заданными данными, а под целостностью понимается то, что эти действия выполняются корректно. Сходство между этими двумя понятиями заключается в том, что СУБД должна проверить не нарушают ли действия пользователя определенных правил. Подобные правила описываются администратором баз данных на определенном языке, для этого в стандарте SQL есть специальные элементы для поддержки безопасности и целостности – это представления, хранимые процедуры и триггеры. Необходимо определить стратегии для ограничения ссылочной целостности в базе данных для каждой из связей. Стратегии могут применяться на трех основных действиях над таблицами: на вставку, удаление или модификацию кортежей. Так, для каждой связи между 2 таблицами выбираются стратегии на удаление, вставку и модификацию для родительской и дочерней таблиц с целью дальнейшего решения о возможном использовании средств обеспечения целостности данных для реализации этих стратегий. По стандарту SQL есть 3 вида стратегий: restrict - запрещающая, cascade – каскадного обновления, удаления или вставки данных, и set null – стратегия установки null-значений в атрибутах. Если какое-либо действие не может нарушить целостность данных, то можно оставить его без определенной стратегии и не совершать при его происхождении никаких действий. Стратегии для каждой связи изображены на физической схеме и представлены на рисунке 7.  Рисунок 7 – Стратегии ограничения ссылочной целостности Представление – это статические определение динамической таблицы базы данных, созданной из одной или более базовых таблиц в соответствие с критериями заданной выборки. Другими словами, представление – это кадр, через который пользователь видит данные, существующие в базе данных на текущий момент времени. С технической точки зрения представление- это хранимое в базе данных определение инструкции SELECT-запроса с заданными в ней строками и столбцами, которые должны считываться при обращении к представлению. После создания представления к нему можно обращаться, как к обычной таблице базы данных. Помимо представлений, как способа обработки данных, реляционные СУБД могут хранить и хранимые процедуры. Хранимые процедуры позволяют использовать помимо языка SQL операторы алгоритмических языков программирования, а также средства обработки ошибочных ситуаций. Триггер - вид хранимой процедуры. Триггер не может вызываться непосредственно пользователем, он привязывается к какой-либо базовой таблице и выполняется автоматически СУБД при вставке, удалении или модификации записей в таблице. Примеры запросов на создание пользователей, представлений, триггеров и хранимых процедур приведены в приложении Б. Примеры триггеров приведены в приложении Б. Заключение В ходе выполнения курсовой работы были решены следующие задачи: а) была построена модель описания бизнес-процессов предметной области; б) было осуществлено поэтапное (логическое и физическое) проектирование базы данных; в) была продемонстрирована работа базы данных, выполнены несколько запросов; г) были обеспечены безопасность и целостность данных (определены стратегии ссылочной целостности, созданы представления, хранимые процедуры, триггеры, новые пользователи с ограниченными правами). Таким образом, цель работы – проектирование и реализация базы данных для учёта расчётов с абонентами сотовой связи – была достигнута. Список литературы 1 Коннолли Т. Базы данных / Томас Конноли// 6 изд., – М.: «Вильямс», 2003 – 1440 с. - ISBN 5-8459-0527-3. 2 Дейт К. Введение и системы баз данных /Крис Дейт// 6 изд., – Киев: Диалектика, 1999. – 848 с. - ISBN 1-9279-2114-6. 3 Мейер, Д. Теория реляционных баз данных /Д. Мейер// – М.:Мир, 1987. – 608 с. - б ISBN 5-5579-01994-2, ISBN 1-546-15681-0. 4 Олькина Е.В. Методические указания по оформлению пояснительных записок к дипломным, курсовым проектам (работам) и отчетов по практикам в соответствии с требованиями государственных стандартов [Текст] / Олькина Е.В. – Орел: ОрелГТУ, 2007. Приложение А (обязательное) Скрипт базы данных Листинг DDL-запросов на создание таблиц и связей: CREATE TABLE Client_info( Passport_number VARCHAR(12) NOT NULL, Name VARCHAR(255) NOT NULL, Address VARCHAR(255) NOT NULL, Sex CHAR NOT NULL) ALTER TABLE Client_info ADD PRIMARY KEY (Passport_number) CREATE TABLE Detailed_calls( ID_Detail INT NOT NULL, Talk_time INT NOT NULL, Date_of_call DATE NOT NULL, Call_price REAL NOT NULL, ID_Num INT NOT NULL, Call_number VARCHAR(255) NOT NULL) ALTER TABLE Detailed_calls ADD PRIMARY KEY (ID_Detail) CREATE TABLE Recharge_balance( ID_Recharge INT NOT NULL, Date_recharge DATE NOT NULL, Recharge_sum REAL NOT NULL, ID_Num INT NOT NULL) ALTER TABLE Recharge_balance ADD PRIMARY KEY (ID_Recharge) CREATE TABLE Service( ID_Service INT NOT NULL, Title VARCHAR(255) NOT NULL, Monthly_price REAL NOT NULL ) ALTER TABLE Service ADD PRIMARY KEY (ID_Service) CREATE TABLE Tariff( ID_Tariff INT NOT NULL, Title VARCHAR(255) NOT NULL, Price_per_conversation_minute REAL NOT NULL, Sms_price REAL NOT NULL) ALTER TABLE Tariff ADD PRIMARY KEY (ID_Tariff) CREATE TABLE Telephones( ID_Num INT NOT NULL, Phone_number VARCHAR(255) NOT NULL, Balance REAL NOT NULL, Is_active SMALLINT NOT NULL, Passport_number VARCHAR(12) NOT NULL, ID_Tariff INT NOT NULL) ALTER TABLE Telephones ADD PRIMARY KEY (ID_Num) CREATE TABLE Telephones_Services( Date_connection DATE NOT NULL, Date_disconnection DATE NULL, ID_Service INT NOT NULL, ID_Num INT NOT NULL, ID_Telephone_Services CHAR(18) NOT NULL) ALTER TABLE Telephones_Services ADD PRIMARY KEY (ID_Telephone_Services) ALTER TABLE Detailed_calls ADD FOREIGN KEY (ID_Num) REFERENCES Telephones(ID_Num) ALTER TABLE Recharge_balance ADD FOREIGN KEY (ID_Num) REFERENCES Telephones(ID_Num) ALTER TABLE Telephones ADD FOREIGN KEY (Passport_number) REFERENCES Client_info(Passport_number) ALTER TABLE Telephones ADD FOREIGN KEY (ID_Tariff) REFERENCES Tariff(ID_Tariff) ALTER TABLE Telephones_Services ADD FOREIGN KEY (ID_Service) REFERENCES Service(ID_Service) ALTER TABLE Telephones_Services ADD FOREIGN KEY (ID_Num) REFERENCES Telephones(ID_Num) Листинг DML-запросов на ввод данных: INSERT INTO "TARIFF" ("ID_TARIFF", "TITLE", "PRICE_PER_CONVERSATION_MINUTE", "SMS_PRICE") VALUES (0, 'ОБЫЧНЫЙ', 8, 2); INSERT INTO "TARIFF" ("ID_TARIFF", "TITLE", "PRICE_PER_CONVERSATION_MINUTE", "SMS_PRICE") VALUES (1, 'ПРОФЕССИОНАЛЬНЫЙ', 6.5, 3); INSERT INTO "TARIFF" ("ID_TARIFF", "TITLE", "PRICE_PER_CONVERSATION_MINUTE", "SMS_PRICE") VALUES (2, 'НЕОБЫЧНЫЙ', 0, 0.05); INSERT INTO "SERVICE" ("ID_SERVICE", "TITLE", "MONTHLY_PRICE") VALUES (0, 'Безлимитные звонки', 1000); INSERT INTO "SERVICE" ("ID_SERVICE", "TITLE", "MONTHLY_PRICE") VALUES (1, 'Безлимитные СМС', 300); INSERT INTO "SERVICE" ("ID_SERVICE", "TITLE", "MONTHLY_PRICE") VALUES (2, 'Замени гудок', 200); INSERT INTO "CLIENT_INFO" ("PASSPORT_NUMBER", "NAME", "ADDRESS", "SEX") VALUES ('5410185202', 'Боярский Эдуард Ахметович', 'Россия г.Орёл ул.Ленина 1-10', 'М'); INSERT INTO "CLIENT_INFO" ("PASSPORT_NUMBER", "NAME", "ADDRESS", "SEX") VALUES ('5408203000', 'Коротков Данил Сергеевич', 'Россия г.Орёл ул.Орловских Партизан 10-92', 'М'); INSERT INTO "CLIENT_INFO" ("PASSPORT_NUMBER", "NAME", "ADDRESS", "SEX") VALUES ('5280102412', 'Андреева Ольга Николаевна', 'Россия г.Орёл ул.Маринченко 5-23', 'Ж'); INSERT INTO "TELEPHONES_SERVICES" ("DATE_CONNECTION", "DATE_DISCONNECTION", "ID_SERVICE", "ID_NUM", "ID_TELEPHONE_SERVICES") VALUES ('05.12.2015', '06.12.2015', 0, 1, '0'); INSERT INTO "TELEPHONES_SERVICES" ("DATE_CONNECTION", "DATE_DISCONNECTION", "ID_SERVICE", "ID_NUM", "ID_TELEPHONE_SERVICES") VALUES ('04.10.2015', '06.10.2015', 1, 2, '1'); INSERT INTO "TELEPHONES_SERVICES" ("DATE_CONNECTION", "DATE_DISCONNECTION", "ID_SERVICE", "ID_NUM", "ID_TELEPHONE_SERVICES") VALUES ('06.12.2015', NULL, 0, 2, '2'); INSERT INTO "TELEPHONES_SERVICES" ("DATE_CONNECTION", "DATE_DISCONNECTION", "ID_SERVICE", "ID_NUM", "ID_TELEPHONE_SERVICES") VALUES ('06.15.2015', '08.15.2015', 2, 0, '3'); INSERT INTO "RECHARGE_BALANCE" ("ID_RECHARGE", "DATE_RECHARGE", "RECHARGE_SUM", "ID_NUM") VALUES (0, '05.10.2015', 50, 0); INSERT INTO "RECHARGE_BALANCE" ("ID_RECHARGE", "DATE_RECHARGE", "RECHARGE_SUM", "ID_NUM") VALUES (1, '05.12.2015', 100, 1); INSERT INTO "RECHARGE_BALANCE" ("ID_RECHARGE", "DATE_RECHARGE", "RECHARGE_SUM", "ID_NUM") VALUES (2, '04.15.2015', 300, 0); INSERT INTO "RECHARGE_BALANCE" ("ID_RECHARGE", "DATE_RECHARGE", "RECHARGE_SUM", "ID_NUM") VALUES (3, '04.27.2015', 150, 2); INSERT INTO "TELEPHONES" ("ID_NUM", "PHONE_NUMBER", "BALANCE", "IS_ACTIVE", "PASSPORT_NUMBER", "ID_TARIFF") VALUES (0, '89208010001', 100, 1, '5280102412', 0); INSERT INTO "TELEPHONES" ("ID_NUM", "PHONE_NUMBER", "BALANCE", "IS_ACTIVE", "PASSPORT_NUMBER", "ID_TARIFF") VALUES (1, '89208010002', 30, 1, '5408203000', 1); INSERT INTO "TELEPHONES" ("ID_NUM", "PHONE_NUMBER", "BALANCE", "IS_ACTIVE", "PASSPORT_NUMBER", "ID_TARIFF") VALUES (2, '89208010003', 0, 0, '5410185202', 2); Приложение Б (обязательное) |