Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Сравнение двух одинаковых таблиц... / 20 сообщений из 20, страница 1 из 1
23.09.2002, 13:41:25
    #32052366
Alex_VB
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух одинаковых таблиц...
Есть две таблицы, одинаковые (одна рабочая, другая архивная). Нужно в архивной табл. хранить данные из рабочей. Допустим, в рабочей таблице добавялись какие-то данные, или удалялись, при работе с архивом за текущий период необходимо внести все изменения, которые делались в рабочей таблице. Как лучше это сделать? Удалять старые данные в архивной и вставлять все из рабочей или путем сравнения поля ID, добавлять и обновлять архивную таблицу???
...
Рейтинг: 0 / 0
23.09.2002, 13:46:52
    #32052368
Ден
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух одинаковых таблиц...
У меня была такая же проблемка, я добавил дополнительное поле, если запись добавлена в архив, то ставится значение 1, если эта запись была модифицирована, то 0. А раз в сутки простым запросом данные в архиве обновляются.
...
Рейтинг: 0 / 0
23.09.2002, 13:52:23
    #32052371
Зайцев Фёдор
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух одинаковых таблиц...
timestamp?
...
Рейтинг: 0 / 0
23.09.2002, 13:59:19
    #32052376
Ден
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух одинаковых таблиц...
Ну в принципе можно и через timestamp, но мне показалось это не очень удобно, так как timestamp меняется произвольно, а так либо 0 либо 1 - все ясно и понятно -))
...
Рейтинг: 0 / 0
23.09.2002, 14:20:37
    #32052383
Alexander_Yudakov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух одинаковых таблиц...
На мой, далекий правда от професионального, вгляд, преимущества Timestamp, в отличие нуля и единицы, примерно таковы:
1) не нужно при обновлении архива обновлять рабочую таблицу (ставить там единицы), тем самым запирая ее в транзакции;
2) не нужно при в рабочей таблице постоянно ставить нули, тратя на это драгоценные байты кода;
3) можно сделать повторное обновление архива;
4) обновление архива можно делать за произвольный период изменения рабочей таблицы.
...
Рейтинг: 0 / 0
23.09.2002, 14:43:28
    #32052386
Ден
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух одинаковых таблиц...
Ну начнем с того, что когда эта база создавалась, она была на Аккесс -)) А потом мне просто не захотелось ломать уже существующую логику.. А если бы с нуля её проектировал, то наверно все по другому сделал бы..
...
Рейтинг: 0 / 0
23.09.2002, 16:23:47
    #32052417
Alex_VB
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух одинаковых таблиц...
Т.е. если я правильно понял, я ввожу новое поле с типом timestamp. А в какой таблице его лучше вводить? Не пользовался ни разу, поэтому и спрашиваю. И как правильно использовать?
...
Рейтинг: 0 / 0
23.09.2002, 16:51:55
    #32052433
sergwsk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух одинаковых таблиц...
Введите во все таблицы БД. Потом понадобятся.
Затем создайте табличку "ВременнАяМетка". И храните в ней значение @@DBTS для БД. Это значение сравнивайте с текущем значением @@DBTS. Все строки, значения поля типа TimeStamp которых попадает между этими значениями, изменились (либо добавились) и эти строки необходимо перенести в архив. После операции обновления архива - занесите новое значение @@DBTS в таблицу "ВременнАяМетка".

P.S.
1. Схема не работает при удалении записей.
2. Архив будет слегка отставать по времени от рабочей БД, особенно когда БД активно используется.
...
Рейтинг: 0 / 0
23.09.2002, 16:56:42
    #32052435
Garya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух одинаковых таблиц...
Хотел было брякнуть про "лог шипинг", но решил не вякать :). Ибо следующий вопрос будет - а что это такое... ИМХО, очень вредно для здоровья связывться с логшипингом тем, кто не разобрался с timestamp.
...
Рейтинг: 0 / 0
23.09.2002, 17:34:51
    #32052451
Alexander_Yudakov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух одинаковых таблиц...
Попробуйте примерно вот так. У меня на простом примере сработало. Никаких специальных временных меток не нужно.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
 -- 1. ПОДГОТОВКА ТАБЛИЦ К РАБОТЕ
 
 -- а) подготовка рабочей таблицы
 
Alter table РабочаяТаблица
Add ts TimeStamp

 -- б) подготовка архивной таблицы
 
Сreate table АрхивнаяТаблица (<Поле1, Поле2… (кроме поля «ts»)>, ts varbinary( 8 ))


 -- 2. ОБНОВЛЕНИЕ АРХИВНОЙ ТАБЛИЦЫ
 

 -- а) обновление измененных строк
 
update АрхивнаяТаблица
set Поле1 = РабочаяТаблица.Поле1,
    Поле2 = РабочаяТаблица.Поле2,
    ...
    ts = РабочаяТаблица.ts
from РабочаяТаблица
join АрхивнаяТаблица
on РабочаяТаблица.ID = АрхивнаяТаблица.ID
where РабочаяТаблица.ts <> АрхивнаяТаблица.ts

 -- б) вставка добавленных строк
 
insert into АрхивнаяТаблица
select *
from РабочаяТаблица
where not exists 
(
 Select *
 from АрхивнаяТаблица
 where АрхивнаяТаблица.ID = РабочаяТаблица.ID
)

 -- в) удаление удаленных строк
 
delete from АрхивнаяТаблица
where not exists
(
 Select *
 from РабочаяТаблица
 where АрхивнаяТаблица.ID = РабочаяТаблица.ID
)
...
Рейтинг: 0 / 0
24.09.2002, 10:56:24
    #32052577
Alex_VB
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух одинаковых таблиц...
Пример хороший, но вылетает ошибка при преобразовании типа varchar (АрхивнаяТаблица.ts)=РабочаяТаблица.ts в тип timestamp...
...
Рейтинг: 0 / 0
24.09.2002, 11:13:03
    #32052588
sergwsk
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух одинаковых таблиц...
Я использовал @@DBTS как возвращаемый параметр ХП:

@ТекущаяВременнАяМетка AS TIMESTAMP OUTPUT
А в ADO ловил, как :

("ТекущаяВременнАяМетка", adInteger, adParamOutput)

Года на 3-4, я думаю, хватит :-)).
...
Рейтинг: 0 / 0
24.09.2002, 12:11:31
    #32052620
Zero
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух одинаковых таблиц...
Привет всем.Подскажите пожалуста что такое Timestamp?
...
Рейтинг: 0 / 0
24.09.2002, 12:18:40
    #32052624
Zero
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух одинаковых таблиц...
Сорри.Нашел на форуме.
...
Рейтинг: 0 / 0
24.09.2002, 14:04:57
    #32052671
Alex_VB
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух одинаковых таблиц...
Тот код, который был дан в этом примере, работает только для удаленных и добалвенных записей, а вот для измененных не работает...
Почему?
...
Рейтинг: 0 / 0
24.09.2002, 15:52:54
    #32052723
Артем
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух одинаковых таблиц...
А какое движение происхоит по активной базе? когда происходит резерв?

Если данные сохраняются в момент когда на серваке никого нет и долго не будет может все таки лучше дропнуть все и не забивать себе мозги не нужными процессами.

Соотношение производительность/цена в данном случае явно повыше будет чем проводить анализ наличия либо отсутствия изменения данных в таблице.
...
Рейтинг: 0 / 0
25.09.2002, 12:26:37
    #32052963
Alexander_Yudakov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух одинаковых таблиц...
1. «...код ...работает только для удаленных и добалвенных записей, а вот для измененных не работает...»

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

2. «...вылетает ошибка при преобразовании типа varchar (АрхивнаяТаблица.ts)=РабочаяТаблица.ts в тип timestamp...»

Тип поля "АрхивнаяТаблица.ts" должен быть не "varchar(x)", а "varbinary(8)".


Как ответите, бросьте, пожалуйста, SMS на +79272040263. Можно отсюда .
...
Рейтинг: 0 / 0
25.09.2002, 13:24:47
    #32052986
Alex_VB
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух одинаковых таблиц...
У меня две таблицы с абсолютно одинаковой структурой (просто в разных базах: первая Zavod - в рабочей базе Remont, вторая Zavod - в архивной базе Archiv_Remont). Есть 4 поля:
ID_Plnt = (bigint), PK, Identity - Yes (Not for replication);
Zav_isp = (int)
Zavod = (char)
ts = в архивной таблице (varbinary(8)), и в рабочей (timestamp).
Правда, в архивной таблице в поле ID_Plnt Identity = No. Но я не знаю играет ли это какую-нибдуь роль при обновлении, но при Identity = Yes, он не может вставить данные и ругается.
Я исправляю данные в рабочей таблице, допустим, меняю значение поля Zavod, выполняю код, но обновления в архиве не происходит...
Я в недоумении, почему???
...
Рейтинг: 0 / 0
25.09.2002, 15:08:50
    #32053031
Alexander_Yudakov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух одинаковых таблиц...
А у меня почему-то работает.
В приведенном ниже примере во избежание неприятностей создаются две новые базы данных.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
 -- =====================================
 
 -- СОЗДАЕМ БАЗЫ ДАННЫХ
 
 -- =====================================
 

 -- Для повторения эксперимента:
 
 /*
Use tempdb
Drop database Remont_Test
Drop database Archiv_Remont_Test
*/ 

Create database Remont_Test
Create database Archiv_Remont_Test

 -- =====================================
 
 -- СОЗДАЕМ ТАБЛИЦЫ
 
 -- =====================================
 

Use Remont_Test

Create table Zavod
(
 ID_Plnt bigint identity not for replication not null,
 Zav_isp int not null,
 Zavod char( 10 ) not null,
 ts timestamp not null,
 constraint PK_Zavod primary key clustered(ID_Plnt)
)

Use Archiv_Remont_Test

Create table Zavod
(
 ID_Plnt bigint not null,
 Zav_isp int not null,
 Zavod char( 10 ) not null,
 ts varbinary( 8 ) not null,
 constraint PK_Zavod primary key clustered(ID_Plnt)
)
go


 -- =====================================
 
 -- СОЗДАЕМ ПРОЦЕДУРУ РЕПЛИКАЦИИ
 
 -- =====================================
 


Create procedure UpdateData
as

 -- а) обновление измененных строк
 
update АрхивнаяТаблица
set Zav_isp = РабочаяТаблица.Zav_isp,
    Zavod = РабочаяТаблица.Zavod,
    ts = РабочаяТаблица.ts
from Remont_Test..Zavod РабочаяТаблица
join Zavod АрхивнаяТаблица
on РабочаяТаблица.ID_Plnt = АрхивнаяТаблица.ID_Plnt
where РабочаяТаблица.ts <> АрхивнаяТаблица.ts

 -- б) вставка добавленных строк
 
insert into Zavod
select *
from Remont_Test..Zavod РабочаяТаблица
where not exists 
(
 Select *
 from Zavod АрхивнаяТаблица
 where АрхивнаяТаблица.ID_Plnt = РабочаяТаблица.ID_Plnt
)

 -- в) удаление удаленных строк
 
delete from Zavod
where not exists
(
 Select *
 from Remont_Test..Zavod РабочаяТаблица
 where Zavod.ID_Plnt = РабочаяТаблица.ID_Plnt
)
go


 -- =====================================
 
 -- ПРОБУЕМ, ЧТОТ ПОЛУЧИЛОСЬ
 
 -- =====================================
 


 -- очистка таблиц от предыдущих экспериментов
 
Use Archiv_Remont_Test
Delete from Zavod

Use Remont_Test
Delete from Zavod

 -- вставка строк в рабочую таблицу
 
Use Remont_Test
Insert into Zavod(Zav_isp, Zavod) values( 1 , 'Завод 1')
Insert into Zavod(Zav_isp, Zavod) values( 2 , 'Завод 2')

 -- проверка вставки в архивную таблицу строк, вставленных в рабочую таблицу
 
Use Archiv_Remont_Test
Exec UpdateData
Select * from Zavod

 -- удаление строки в рабочей таблице
 
Use Remont_Test
Delete from Zavod where ID_Plnt =  1 

 -- проверка удаления в архивной таблице строки, удаленной в рабочей таблице
 
Use Archiv_Remont_Test
Exec UpdateData
Select * from Zavod

 -- изменение строки в рабочей таблице
 
Use Remont_Test
Update Zavod
set Zavod = 'Замена'
where ID_Plnt =  2 

 -- проверка изменения в архивной таблице строки, изменения в рабочей таблице
 
Use Archiv_Remont_Test
Exec UpdateData
Select * from Zavod
...
Рейтинг: 0 / 0
26.09.2002, 09:51:12
    #32053160
Alex_VB
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сравнение двух одинаковых таблиц...
Огромная признательность и благодарность Александру Юдакову!!! Все заработало!УРА!!!
Я понял свою ошибку.
Дело в том, что при обновлении архива я обновлял и поле ID_Plnt, а этого не нужно было делать...
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Сравнение двух одинаковых таблиц... / 20 сообщений из 20, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]