Реализация распределенной базы данных с удаленным доступом

Автор работы: Пользователь скрыл имя, 30 Ноября 2011 в 00:17, курсовая работа

Краткое описание

В дипломном проекте рассмотрены общие подходы к реализации распределенных систем обработки данных на базе технологии клиент-сервер, а также задача создания действующей информационной системы на примере системы автоматизации расчетов с абонентами АО «Связьинформ» РМ. Актуальность построения этой системы обусловлена резким ростом количества предоставляемых услуг связи, а также переходом некоторых районов на повременную систему тарификации разговоров.
В процессе написания дипломной работы автором велась разработка архитектуры информационной системы, механизма репликации данных, средств удаленного доступа и удаленного администрирования системы, структуры БД, а также некоторых компонентов клиентской части системы (справочной службы и картотеки абонентов).

Содержание работы

ВВЕДЕНИЕ 4
1. ОСНОВНЫЕ ПОДХОДЫ К ПРОЕКТИРОВАНИЮ РАСПРЕДЕЛЕННЫХ БАЗ ДАННЫХ 6
1.1 ОСНОВНЫЕ ПОНЯТИЯ ТЕОРИИ РЕЛЯЦИОННЫХ БАЗ ДАННЫХ 6
1.2 СЕРВЕР БАЗЫ ДАННЫХ 10
1.2.1 Технология и модели "клиент-сервер" 10
1.2.2 Механизмы реализации активного ядра 19
1.2.3 Хранимые процедуры 20
1.2.4 Правила (триггеры) 21
1.2.5 Механизм событий 21
1.3 ОБРАБОТКА РАСПРЕДЕЛЕННЫХ ДАННЫХ 22
1.4 ВЗАИМОДЕЙСТВИЕ С PC-ОРИЕНТИРОВАННЫМИ СУБД 30
1.5 ОБРАБОТКА ТРАНЗАКЦИЙ 33
1.6 СРЕДСТВА ЗАЩИТЫ ДАННЫХ В СУБД 37
1.7 ПРИМЕНЕНИЕ CASE-СРЕДСТВ ДЛЯ ИНФОРМАЦИОННОГО МОДЕЛИРОВАНИЯ В СИСТЕМАХ ОБРАБОТКИ ДАННЫХ . 41
2. РЕАЛИЗАЦИЯ РАСПРЕДЕЛЕННОЙ БАЗЫ ДАННЫХ С УДАЛЕННЫМ ДОСТУПОМ 43
2.1 АНАЛИЗ СУЩЕСТВУЮЩЕЙ СИСТЕМЫ 44
2.2 НОВАЯ СХЕМА ОБМЕНА ИНФОРМАЦИЕЙ 45
2.3 ВЫБОР ОПЕРАЦИОННОЙ СИСТЕМЫ 47
2.4 ВЫБОР СЕРВЕРА БАЗ ДАННЫХ 48
2.5 ВЫБОР СРЕДСТВ РАЗРАБОТКИ 55
2.6 ОРГАНИЗАЦИЯ ВЗАИМОДЕЙСТВИЯ МЕЖДУ СЕРВЕРАМИ 56
2.6.1 Выбор модели распределенной базы данных 56
2.6.2 Модель взаимодействия 56
2.6.3 Использование слоя RPC для распределенной обработки данных на платформе Windows NT 57
2.6.4 Компоненты Microsoft RPC 57
2.6.5 Механизм работы RPC 58
2.6.6 Организация логического канала передачи данных 61
2.7 ОРГАНИЗАЦИЯ ДОСТУПА УДАЛЕННЫХ ПОЛЬЗОВАТЕЛЕЙ 61
2.7.1 Необходимость удаленного доступа 61
2.7.2 Использование слоя RAS для удаленного доступа на платформе Windows NT 61
2.7.3 Обеспечение информационной безопасности при удаленном доступе 63
2.8 ПРОЕКТИРОВАНИЕ СТРУКТУРЫ БАЗЫ ДАННЫХ 63
2.9 СХЕМА РЕПЛИКАЦИИ ДАННЫХ 65
2.10 ПРОЕКТИРОВАНИЕ КОММУНИКАЦИОННОГО СЕРВЕРА 67
2.10.1 Постановка задачи 67
2.10.2 Архитектура коммуникационного сервера 68
2.10.3 Вспомогательное программное обеспечение 70
3. ТЕХНИКО-ЭКОНОМИЧЕСКОЕ ОБОСНОВАНИЕ 71
3.1 ПЛАН ВЫПОЛНЕНИЯ ДИПЛОМНОГО ПРОЕКТА 71
3.2 РАСЧЕТ ОЖИДАЕМОЙ ПРОДОЛЖИТЕЛЬНОСТИ ВЫПОЛНЕНИЯ РАБОТ И ИХ ДИСПЕРСИЙ 73
3.3 ПОСТРОЕНИЕ ЛЕНТОЧНОГО ГРАФИКА ВЫПОЛНЕНИЯ РАБОТЫ 74
3.4 ОПРЕДЕЛЕНИЕ ПЛАНОВОЙ СЕБЕСТОИМОСТИ НИР 76
ЗАКЛЮЧЕНИЕ 79
СПИСОК ЛИТЕРАТУРЫ 80

Содержимое работы - 1 файл

РЕАЛИЗАЦИЯ РАСПРЕДЕЛЕННОЙ БАЗЫ ДАННЫХ С УДАЛЕННЫМ ДОСТУПОМ.doc

— 1.41 Мб (Скачать файл)

             TotalFullTime = TotalFullTime+:TTime,

             TotalLgotTime = TotalLgotTime+:LTime

      WHERE Code = :PayCode; 

  END 

END ^ 

CREATE PROCEDURE UslGetOwnerTax(AOwner INTEGER, AUsl INTEGER, ADate DATE) 

RETURNS (ATax               FLOAT,

                   AProcNach     FLOAT,

                   ANalog            FLOAT)

AS

  DECLARE VARIABLE ACategory INTEGER; 

BEGIN  

SELECT  Category FROM PhonesOwners

  WHERE (PKey = :AOwner) AND (:ADate BETWEEN BegDate AND EndDate)

  INTO :ACategory; 
 

  SELECT Tax, NachCoeff, Nalog FROM UslLgots

  WHERE (Usl = :AUsl) AND (:ADate BETWEEN BegDate AND EndDate)

  INTO :ATax, :AProcNach, :ANalog; 
 

EXIT; 

END  

 

Приложение  2

 

Приложение 3

 

Исходные  тексты коммуникационного сервиса

ServiceMain.c

Файл ServiceMain.c - Модуль инициализации и управления сервером. 

/*************************************************************/

/*           Main unit for Communication Service             */

/*                  Copyright (c) 1997 by Malkov O.V.        */

/*                      JSC "Svyazinform"  RM                */

/*************************************************************/ 

#include <windows.h>

#include "DoService.h"

#include "CommonConfig.h" 

/* Globals */

SERVICE_STATUS          ServiceStatus;

SERVICE_STATUS_HANDLE  ServiceStatusHandle; 

/* Function Prototypes */

void WINAPI ServiceStart (DWORD   argc, LPTSTR  *argv);

VOID WINAPI ServiceCtrlHandler (IN  DWORD opcode);

DWORD ServiceInitialization(DWORD argc, LPTSTR  *argv,

        DWORD  *specificError); 
 

VOID _CRTAPI1 main(int argc, char **argv)

{

      int i; 

    SERVICE_TABLE_ENTRY   DispatchTable[] = {

            { TEXT("SiTime"), ServiceStart },

        { NULL,              NULL           }

    }; 

    /* Allow the user to override settings with command line switches */

    for ( i = 1; i < argc; i++) {

        if ((*argv[i] == '-') || (*argv[i] == '/')) {

               switch (tolower(*(argv[i]+1))) {

                case 'p':  // protocol sequence

                    pszProtocolSequence = argv[++i];

                    break;

                case 'e':  // endpoint

                    pszEndpoint = argv[++i];

                    break;

                default: ;

             }

         }

      } 

    if (!StartServiceCtrlDispatcher( DispatchTable)) {

            /* Error Handling */

    }

} 

void WINAPI ServiceStart(DWORD   argc, LPTSTR  *argv) 

{

    DWORD   status;

    DWORD   specificError; 

    ServiceStatus.dwServiceType        = SERVICE_WIN32;

    ServiceStatus.dwCurrentState       = SERVICE_START_PENDING;

    ServiceStatus.dwControlsAccepted   = SERVICE_ACCEPT_STOP |

        SERVICE_ACCEPT_PAUSE_CONTINUE;

    ServiceStatus.dwWin32ExitCode      = 0;

    ServiceStatus.dwServiceSpecificExitCode = 0;

    ServiceStatus.dwCheckPoint         = 0;

    ServiceStatus.dwWaitHint           = 0; 

    ServiceStatusHandle = RegisterServiceCtrlHandler(

                            TEXT("SiTime"),

                            ServiceCtrlHandler); 

    if (ServiceStatusHandle == (SERVICE_STATUS_HANDLE)0) {

            /*  Error Handling */           

        return;

   } 

    // Initialization code goes here.

    status = ServiceInitialization(argc,argv, &specificError); 

    // Handle error condition

    if (status != NO_ERROR) {

        ServiceStatus.dwCurrentState       = SERVICE_STOPPED;

        ServiceStatus.dwCheckPoint         = 0;

        ServiceStatus.dwWaitHint           = 0;

        ServiceStatus.dwWin32ExitCode      = status;

        ServiceStatus.dwServiceSpecificExitCode = specificError; 

        SetServiceStatus (ServiceStatusHandle, &ServiceStatus);

        return;

    } 

    // Initialization complete - report running status

    ServiceStatus.dwCurrentState       = SERVICE_RUNNING;

    ServiceStatus.dwCheckPoint         = 0;

    ServiceStatus.dwWaitHint           = 0; 

    if (!SetServiceStatus (ServiceStatusHandle, &ServiceStatus)) {

        status = GetLastError();

    } 

    // This is where the service does its work.     //

    ServerProcess(); 

    return;

} 

/* stub initialization function */

DWORD ServiceInitialization(DWORD   argc, LPTSTR  *argv,

        DWORD *specificError)

{

    *specificError = ServerInit();

      if (*specificError) return *specificError;

  return(0);

} 

void WINAPI ServiceCtrlHandler ( IN  DWORD   Opcode)

{ 

    DWORD   status; 

    switch(Opcode) {

    case SERVICE_CONTROL_PAUSE:

        /* Do whatever it takes to pause here.  */

            ServerDoPause();

        ServiceStatus.dwCurrentState = SERVICE_PAUSED;

        break; 

    case SERVICE_CONTROL_CONTINUE:

        /* Do whatever it takes to continue here.*/ 

            ServerDoContinue();

        ServiceStatus.dwCurrentState = SERVICE_RUNNING;

        break; 

    case SERVICE_CONTROL_STOP:

        /* Do whatever it takes to stop here.  */

            ServerDoStop();

        ServiceStatus.dwWin32ExitCode = 0;

        ServiceStatus.dwCurrentState  = SERVICE_STOPPED;

        ServiceStatus.dwCheckPoint    = 0;

        ServiceStatus.dwWaitHint      = 0; 

        if (!SetServiceStatus (ServiceStatusHandle, &ServiceStatus))

        {

            status = GetLastError();

        } 

        return; 

    case SERVICE_CONTROL_INTERROGATE:

        /* fall through to send current status */

        break; 

    default:

            /* Error handling */

            break;

    } 

    /* Send current status.*/

    if (!SetServiceStatus (ServiceStatusHandle,  &ServiceStatus)) {

        status = GetLastError();

    }

    return;

} 

CommonConfig.c

Файл CommonConfig.c - Управление конфигурацией

#include <windows.h>

#include "CommonConfig.h"

#include "EventLog.h" 

#define REGVALUENAME_LENGTH 255 

DWORD ConfigWatchingThread; 

HANDLE hConfigMutex = NULL;

HANDLE hTaskMutex = NULL; 

unsigned char * pszProtocolSequence = "ncacn_np";

unsigned char * pszSecurity         = NULL;

unsigned char * pszEndpoint         = "\\pipe\\CommServ";

unsigned int    cMinCalls           = 1;

unsigned int    cMaxCalls           = 20;

unsigned int    fDontWait           = FALSE; 

struct TASKENTRY TaskTable[TASK_COUNT];

int  EntryCount = 0;

DWORD TaskThreads[TASK_COUNT];

int  TaskCount = 0; 
 

void UpdateVariables()

{

      HKEY hKey;

      DWORD dwIndex = 0;

      DWORD VNameLength = REGVALUENAME_LENGTH;

      char VName[REGVALUENAME_LENGTH];

      DWORD dwLength = sizeof(struct TASKENTRY);

      int  i; 

      __try {

            WaitForSingleObject(hConfigMutex, INFINITE); 

            // Инициализация таблицы  задач

            for (i = 0; i < TASK_COUNT; i++) { 

                  TaskTable[i].Active  = FALSE;

                  TaskTable[i].ExecTime = 0;

                  ZeroMemory(&TaskTable[i].DllName, sizeof(TaskTable[i].DllName));

                  TaskTable[i].TermProc = NULL;

                  TaskTable[i].TaskThread = 0;

            } 

            // Загрузка таблицы  задач из реестра

            if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,

                   REGISTRY_TASKS_PATH,

                   0, KEY_ALL_ACCESS, &hKey) == ERROR_SUCCESS) { 

                  dwIndex  = 0;

                  EntryCount = 0;

                  while (RegEnumValue(hKey,

                                                dwIndex,

                                                (char *)&VName,

                                                &VNameLength,

                                                NULL,

                                                NULL,

                                                (LPVOID)&TaskTable[dwIndex],

                                                &dwLength) == ERROR_SUCCESS) { 

                        if (dwLength != sizeof(struct TASKENTRY)) {

                              LogEvent(EVENTLOG_ERROR_TYPE, "Invalid Task Parameter");

                              break;

                        }

                        EntryCount+=1;

                        dwIndex+=1;

                  }

                  RegCloseKey(hKey);

            } else LogEvent(EVENTLOG_ERROR_TYPE, "Error Loading Configuration");

      }

      __finally {

            ReleaseMutex(hConfigMutex);

      }

} 

DoService.c

#include <windows.h>

#include "DoService.h"

#include "..\Comm.h"

#include "CommonConfig.h"

#include "ClientHandler.h"

#include "EventLog.h"

#include "ShedulerServ.h" 

void ServerProcess() { 

      hConfigMutex = CreateMutex(NULL, FALSE, NULL);

      hTaskMutex  = CreateMutex(NULL, FALSE, NULL);

      CreateThread(NULL, 0, ShedulingProc, NULL, 0, &ShedulingThread);

    CreateThread(NULL, 0, RPCClientHandling, NULL, 0, &ClientHandlingThread);

} 

DWORD ServerInit() { 

      RPC_STATUS status; 

    status = RpcServerUseProtseqEp(

                           pszProtocolSequence,

                           cMaxCalls,   

                           pszEndpoint,

Информация о работе Реализация распределенной базы данных с удаленным доступом