Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

БД со статической информацией [D6, IB6.x]


Страницы:   1 2

Kombat ©   (2002-06-11 15:04:00) 

HI All! Помогите с советом! Есть БД с информацией которая пишется один раз и потом не меняется (каждый месяц, неделю записываем данные о счетах, накладных клиента, его телефонных переговорах) эта база создается на год (большой объем). И есть БД где хранятся справочники, данные о клиентах и прочая динамическая инфо. Разделение БД обусловлено тем что не хочется каждый день бекапить новые данные вместе со статикой. Кто может подсказать как быть со ссылочной целостностью (иметь копии справочников в БД статики?, синхронизировать их?). Как вообще в таких случаях поступают?


Romkin   (2002-06-13 18:29:00) [1]

В IB гетерогенных запросов по базам нет, есть транзакция на несколько баз, это если нужно обновлять одновременно несколько таблиц в разных базах. Просто открываешь транзакцию, делаешь изменения и далее commit|rollback. При желании можно делать таким образом синхронизацию, например, в одной базе - справочник, в другой таблицы со ссылками на него... В этом случае обновление ссылочных полей делают в транзакции на две базы.
Но, ессно, запрос на выборку одновременно из двух баз сделать нельзя, только разными query в разные наборы данных.
В общем, для сохранения целостности этого обычно достаточно...


Johnny Smith   (2002-06-13 18:20:00) [2]

2TSV © (13.06.02 17:00)
Так все-таки можно или нельзя в IB???
Да можно, можно... Решение будет халявным и вполне надежным. Но только в рамках, вами и указанных: "IB - это СУБД для рабочих групп и этим все сказано"


TSV   (2002-06-13 17:00:00) [3]

Так все-таки можно или нельзя в IB???


Romkin   (2002-06-13 14:00:00) [4]

Ничего не понимаю. Есть же в IB транзакции на несколько БД одновременно, просто давать обновление одновлеменно на две БД, и синхронизация будет.


Alexandr   (2002-06-13 13:47:00) [5]

холдинг, говоришь...
ну-ну.


TSV   (2002-06-13 13:38:00) [6]

По-моему, начался флейм...
Вам не нравится идея, потому что ее нельзя реализовать в IB...

Все верно. IB - это СУБД для рабочих групп и этим все сказано...
А если у вас - холдинг или корпорация, где у каждой юридической единицы своя база (несколько гиг, иногда - десятки), то такая модель - очень даже то. Да и IB тут не потянет в принципе... Каждому свое...


Johnmen   (2002-06-13 13:04:00) [7]

>TSV © (13.06.02 12:56)

MS Word тоже сильно ограниченный - он не умеет вышеприведенного и много чего еще :)))))))))))))))


Alexandr   (2002-06-13 12:59:00) [8]

2Johnny Smith: согласен
2TSV: Не знал, но говорил. Все серверы разные, в каждом есть достоинства и недостатки и это не IB ограниченный, а твои познания ограничены только MSSQL


TSV   (2002-06-13 12:56:00) [9]

Я не знал, что IB такой ограниченный...


Johnny Smith   (2002-06-13 12:49:00) [10]

2Alexandr © (13.06.02 12:17)
человеку для IB надо.
Ну, можно было бы предложить следующее:
1) в каждой таблице создать столбец TimeStamp, в котором хранить время последнего изменения
2) написать самостоятельно прогу, которая бы с некоторой периодичностью бэкапила (как и куда - решит сам автор) только те строки из таблиц, в которых значение TimeStamp"а превышает время последнего бэкапа.


Alexandr   (2002-06-13 12:17:00) [11]

человеку для IB надо.
ну давайте ему предложим еще по Oracle, DB/2, SYBASE, Paradox...
кто там еще чего знает?


TSV   (2002-06-13 12:13:00) [12]

Я лишь предложил идею и ее конкретное воплощение на MSSQL.
Если такой вариант для IB не подходит, то... такова селява... ;-)

С уважением.


Alexandr   (2002-06-13 12:00:00) [13]

все криво.
Вы пытаетесь применить решение этой проблемы на MSSQL к IB.

А на IB надо вообще не так делать.

А хранить нужно все в одной базе и мозги себе не забивать всякой херней.

А частичный бакуп можно свой написать, если уж прижало, а лучше одностороннюю репликацию.

Проверять ссылочную целостность вручную это всегда глюкаво, и решения тут нет при многопользовательской работе.

Давойте так.
На конкретную проблему есть конкретное решение, а вы тут развели демагогию, смешав и MSSQL и IB и подмешав сюда клиентские программы. Смешав частичный бакуп с просеркой целостности в масштабах нескольких баз данных.


TSV   (2002-06-13 11:50:00) [14]

> Lusha © (13.06.02 11:43)
Он не в принципе рабочий, он рабочий на 100%.

И дело не в ссылочной целостности, а в возможности выполнения одной транзакции в разрезе нескольких баз + динамические запросы.

> All
Если в IB этого нельзя сделать, это не значит, что способ плохой... Просто IB менее функционален... ;-)


TSV   (2002-06-13 11:46:00) [15]

Ну, просто COMMIT в триггере неявный ;-). Его можно написать перед RETURN.

> И если для одних доч.БД все прошло, а для др. - нет, то что ?
То ROLLBACK для всех (см. код).


Lusha   (2002-06-13 11:43:00) [16]

Господа, мне кажется, Вас понесло!
Способ предложенный TSV в принципе рабочий... Если даже IB не позволяет реализовать ссылочную целостность для такой структуры БД непосредственно на сервере, то кто Вам мешает воплотить сие на клиенте... Я подобное воял на OnUpdateRecord... :)


Johnmen   (2002-06-13 11:30:00) [17]

А в какой момент и где для дочерних БД делается COMMIT ?
И если для одних доч.БД все прошло, а для др. - нет, то что ?


Fareader   (2002-06-13 11:30:00) [18]

2TSV © Видишь ли в IB вот так посто из тригера нельзя обратиться на другую базу - для этого надо писать UDF, а она уже не зависит от той транзакции, в которой была вызвана. Т.е. если в мастере транзакция откатилась, то изменения, внесенные в сателиты через UDF, просто так не откатяться...


TSV   (2002-06-13 11:24:00) [19]

И еще. Надо следить за тем, чтобы вставлялась (удалялась) одна запись за транзакцию в главной базе.


TSV   (2002-06-13 11:23:00) [20]

Вот кусок из триггера:

CREATE TRIGGER tI_ctOrgAccounts ON ctOrgAccounts FOR INSERT
AS
..................
..................
-- Распространение изменений по рабочим базам
declare @oaID int, @DBName varchar(30), @StrExec varchar(250)
declare Cr cursor for select DBName from usBases
select @oaID = oaID from inserted
open Cr
fetch next from Cr into @DBName
while @@FETCH_STATUS = 0 begin
select @StrExec =
"insert into " + @DBName + ".dbo.tOrgAccounts (oaID) values (" + str(@oaID) + ")"
exec (@StrExec)
if @@ERROR <> 0 begin
close Cr
deallocate Cr
goto ERR
end
fetch next from Cr into @DBName
end
close Cr
deallocate Cr

return
ERR:
rollback tran


Как это сделать в IB, я не знаю. Но думаю, что можно...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо