Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Нужна помощь копирование записей в две связанных таблицы из них же  [new]
linker_2004
Member

Откуда:
Сообщений: 16
Здравствуйте!
Есть две таблицы:
1. id a1,a2,a3,a4,f
2. id b1,b2,b3,f
они связаны по id- идентификатор первой таблицы. f- поле типа int для определения актуальности записи
При каких либо изменениях запись инсертом копируется в таблицу с новым id и изменениями, а старая запись отправляется в архив с f=0
Возникла необходимость поменять значения в нескольких записях(здесь проблем нет), а вот как "отправить архив" из записи.
Как думал я:
1. копировать записи с первой таблицы в неё же по условию с f=2. Тут создаются новые id идентификатором-сделал
2. делать в них изменения-сделал

а тут подзавис, помогите чем можЫте)
3. затем копировать связанные записи из таблицы 2 в неё же с новым ID из таблицы 1
4. "отправить в архив" записи в обеих таблицах(f=0) и в созданных поменять f=1

USE base
DECLARE @STR NVARCHAR(MAX) SET @STR ='111'
--СОЗДАЮ НОВЫЕ ЗАПИСИ В ТАБЛИЦЕ 1
/*INSERT INTO Table1 (a1,a2,a2,a3,a4,f)
SELECT a1,a2,a2,a3,a4,'2'
FROM Book WHERE a1 LIKE '%'+@STR+'%'*/
2 авг 18, 09:32    [21623326]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь копирование записей в две связанных таблицы из них же  [new]
iiyama
Member

Откуда:
Сообщений: 642
linker_2004,

немного офф, видел много реализация SCD, но Ваша не самая удачная. Отслеживание версионности не должно влиять на первичный ключ и связи между таблицами.
Если хочется пилить свое, то посмотрите несколько паттернов здесь
или воспользуйтесь более новым, может это больше понравится
2 авг 18, 12:20    [21624205]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь копирование записей в две связанных таблицы из них же  [new]
StarikNavy
Member

Откуда: Москва
Сообщений: 2394
linker_2004,

архив - в отдельную таблицу
2 авг 18, 13:37    [21624580]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь копирование записей в две связанных таблицы из них же  [new]
linker_2004
Member

Откуда:
Сообщений: 16
iiyama
linker_2004,

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

Спасибо. Почитаю. Забыл написать что в каждой таблице есть поля с датой начала и конца актуальности типа datetime
2 авг 18, 15:11    [21625032]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь копирование записей в две связанных таблицы из них же  [new]
Glebanski
Member

Откуда: Msk ->NL
Сообщений: 308
linker_2004,

Недопонял, зачем новый id генерится.
Вроде бы f - это как-бы номер версии записи, так? Сделайте первичный ключ (id, f) и еще доп-поле isLastVersion, которое м.б 1 или 0
Это наверняка есть в тех ссылках от iiyama
2 авг 18, 19:28    [21626086]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь копирование записей в две связанных таблицы из них же  [new]
Glebanski
Member

Откуда: Msk ->NL
Сообщений: 308
linker_2004

в каждой таблице есть поля с датой начала и конца актуальности типа datetime

Если конец IS NULL вот вам и отличный признак последней версии. А все остальное - "орхив"
2 авг 18, 19:31    [21626095]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь копирование записей в две связанных таблицы из них же  [new]
linker_2004
Member

Откуда:
Сообщений: 16
Glebanski
linker_2004,

Недопонял, зачем новый id генерится.
Вроде бы f - это как-бы номер версии записи, так? Сделайте первичный ключ (id, f) и еще доп-поле isLastVersion, которое м.б 1 или 0
Это наверняка есть в тех ссылках от iiyama

f изначально и был только 0 и 1... немного коряво наверно и не так быстро, но зато работает.. кодить начал месяц назад.. За конструктивную критику отдельное спасибо.
USE Base 
DECLARE @STR NVARCHAR(MAX) SET @STR ='КРУГ'  
DECLARE @STR1 NVARCHAR(MAX) SET @STR1 = 'КРУГ ТЕСТ' 
DECLARE @user NVARCHAR(15) SET @user='ТЕСТ'
DECLARE @curD DATETIME SET @curD='01.08.2018 15:05:29' 
DECLARE @I BIGINT SET @I=1
WHILE @I!=0
 BEGIN
	SELECT @I= (SELECT MIN(ID_NKN)FROM Book WHERE (IM LIKE '%'+@STR+'%')AND(FLAG_A='1'))
	INSERT INTO Table1 (a1,a2,a3,a4, ID_U,D_U,FLAG_A) 
	SELECT a1,a2,a3,a4,@user,@curD,'2'
	FROM Table1
	WHERE (ID=@I) AND (FLAG_A='1')
	INSERT INTO Table2(b1, b2, b3)
	SELECT  b1, b2, b3, @user, @curD,'2',@@IDENTITY
	FROM Table2
	WHERE ID=@I
	UPDATE Table1
	SET FLAG_A=0, D_E=@curD, ID_U=@user
	WHERE ID=@I
	UPDATE Table2
	SET FLAG_A=0, D_E=@curD, ID_U=@user
	WHERE ID_NKN=@I
 END;
UPDATE Table1 SET a1 = (SELECT REPLACE(a1, @STR, @STR1)) 
WHERE (a1 LIKE '%'+@STR+'%') AND (FLAG_A='2')
UPDATE Table1
SET FLAG_A = 1
WHERE FLAG_A=2
SELECT B.ID, B.a1,B.a2,,J.b1,J.b2,J.b3
FROM Table1 AS B LEFT JOIN Table2 AS J
ON B.ID=J.ID
WHERE (B.FLAG_A='1') AND (IM LIKE '%'+@STR+'%')
ORDER BY B.ID


Сообщение было отредактировано: 2 авг 18, 20:27
2 авг 18, 20:24    [21626220]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь копирование записей в две связанных таблицы из них же  [new]
linker_2004
Member

Откуда:
Сообщений: 16
хотел без циклов с циклами наверное не комильфо) но такого рода замены будут не частыми, так что думаю пойдет
2 авг 18, 20:26    [21626226]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь копирование записей в две связанных таблицы из них же  [new]
iiyama
Member

Откуда:
Сообщений: 642
linker_2004,

У меня вопрос, это для учебных целей или производственная задача?
3 авг 18, 10:41    [21627398]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь копирование записей в две связанных таблицы из них же  [new]
linker_2004
Member

Откуда:
Сообщений: 16
iiyama,производственная. Учусь на ходу подсказывать не по содержанию базы кроме интернета толком некому. Пишу программу под существующую базу поля или таблицы добавить могу
3 авг 18, 14:06    [21628381]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь копирование записей в две связанных таблицы из них же  [new]
linker_2004
Member

Откуда:
Сообщений: 16
но как и везде есть голос свыше и ему виднее как должно быть) и не волнуют сущности и прочая "ерунда") но компромиссы бывают
3 авг 18, 14:08    [21628391]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь копирование записей в две связанных таблицы из них же  [new]
iiyama
Member

Откуда:
Сообщений: 642
linker_2004,

В реальной жизни так делать нельзя, хотя бы потому что одновременно могут работать несколько человек.
Не надо придумывать свои грабли, для этих целей уже реализованы не то что грабли, а комбайны

К сообщению приложен файл. Размер - 40Kb
3 авг 18, 14:23    [21628438]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь копирование записей в две связанных таблицы из них же  [new]
linker_2004
Member

Откуда:
Сообщений: 16
iiyama, спасибо. Создал отдел отдельную таблицу в неё пихаю историю. Так действительно намного проще и быстрее
4 авг 18, 21:59    [21630066]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить