powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Сравнение двух одинаковых таблиц...
20 сообщений из 20, страница 1 из 1
Сравнение двух одинаковых таблиц...
    #32052366
Alex_VB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть две таблицы, одинаковые (одна рабочая, другая архивная). Нужно в архивной табл. хранить данные из рабочей. Допустим, в рабочей таблице добавялись какие-то данные, или удалялись, при работе с архивом за текущий период необходимо внести все изменения, которые делались в рабочей таблице. Как лучше это сделать? Удалять старые данные в архивной и вставлять все из рабочей или путем сравнения поля ID, добавлять и обновлять архивную таблицу???
...
Рейтинг: 0 / 0
Сравнение двух одинаковых таблиц...
    #32052368
Фотография Ден
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня была такая же проблемка, я добавил дополнительное поле, если запись добавлена в архив, то ставится значение 1, если эта запись была модифицирована, то 0. А раз в сутки простым запросом данные в архиве обновляются.
...
Рейтинг: 0 / 0
Сравнение двух одинаковых таблиц...
    #32052371
Зайцев Фёдор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
timestamp?
...
Рейтинг: 0 / 0
Сравнение двух одинаковых таблиц...
    #32052376
Фотография Ден
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну в принципе можно и через timestamp, но мне показалось это не очень удобно, так как timestamp меняется произвольно, а так либо 0 либо 1 - все ясно и понятно -))
...
Рейтинг: 0 / 0
Сравнение двух одинаковых таблиц...
    #32052383
Alexander_Yudakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На мой, далекий правда от професионального, вгляд, преимущества Timestamp, в отличие нуля и единицы, примерно таковы:
1) не нужно при обновлении архива обновлять рабочую таблицу (ставить там единицы), тем самым запирая ее в транзакции;
2) не нужно при в рабочей таблице постоянно ставить нули, тратя на это драгоценные байты кода;
3) можно сделать повторное обновление архива;
4) обновление архива можно делать за произвольный период изменения рабочей таблицы.
...
Рейтинг: 0 / 0
Сравнение двух одинаковых таблиц...
    #32052386
Фотография Ден
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну начнем с того, что когда эта база создавалась, она была на Аккесс -)) А потом мне просто не захотелось ломать уже существующую логику.. А если бы с нуля её проектировал, то наверно все по другому сделал бы..
...
Рейтинг: 0 / 0
Сравнение двух одинаковых таблиц...
    #32052417
Alex_VB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Т.е. если я правильно понял, я ввожу новое поле с типом timestamp. А в какой таблице его лучше вводить? Не пользовался ни разу, поэтому и спрашиваю. И как правильно использовать?
...
Рейтинг: 0 / 0
Сравнение двух одинаковых таблиц...
    #32052433
sergwsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Введите во все таблицы БД. Потом понадобятся.
Затем создайте табличку "ВременнАяМетка". И храните в ней значение @@DBTS для БД. Это значение сравнивайте с текущем значением @@DBTS. Все строки, значения поля типа TimeStamp которых попадает между этими значениями, изменились (либо добавились) и эти строки необходимо перенести в архив. После операции обновления архива - занесите новое значение @@DBTS в таблицу "ВременнАяМетка".

P.S.
1. Схема не работает при удалении записей.
2. Архив будет слегка отставать по времени от рабочей БД, особенно когда БД активно используется.
...
Рейтинг: 0 / 0
Сравнение двух одинаковых таблиц...
    #32052435
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хотел было брякнуть про "лог шипинг", но решил не вякать :). Ибо следующий вопрос будет - а что это такое... ИМХО, очень вредно для здоровья связывться с логшипингом тем, кто не разобрался с timestamp.
...
Рейтинг: 0 / 0
Сравнение двух одинаковых таблиц...
    #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
Сравнение двух одинаковых таблиц...
    #32052577
Alex_VB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пример хороший, но вылетает ошибка при преобразовании типа varchar (АрхивнаяТаблица.ts)=РабочаяТаблица.ts в тип timestamp...
...
Рейтинг: 0 / 0
Сравнение двух одинаковых таблиц...
    #32052588
sergwsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я использовал @@DBTS как возвращаемый параметр ХП:

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

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

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

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

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

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

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

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


Как ответите, бросьте, пожалуйста, SMS на +79272040263. Можно отсюда .
...
Рейтинг: 0 / 0
Сравнение двух одинаковых таблиц...
    #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
Сравнение двух одинаковых таблиц...
    #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
Сравнение двух одинаковых таблиц...
    #32053160
Alex_VB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Огромная признательность и благодарность Александру Юдакову!!! Все заработало!УРА!!!
Я понял свою ошибку.
Дело в том, что при обновлении архива я обновлял и поле ID_Plnt, а этого не нужно было делать...
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Сравнение двух одинаковых таблиц...
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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