![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
БД со статической информацией [D6, IB6.x]
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, я не знаю. Но думаю, что можно...