Гость
Map
Форумы / SQL [закрыт для гостей] / Задача для срача / 38 сообщений из 38, показаны все 2 страниц
22.09.2022, 07:39
    #158964
Doublekey
Участник
[скрыт]
[заблокирован]
Поместить в игнор-лист Сообщения автора в теме
Задача для срача
Задачка в аттаче. На мой взгляд весьма неоднозначная.
тестовое задание (1).sql
...
Рейтинг: 0 / 0
22.09.2022, 07:39
    #158965
Doublekey
Участник
[скрыт]
[заблокирован]
Поместить в игнор-лист Сообщения автора в теме
Задача для срача
Сириус палюбому должен знать как решать. он же у нас фуллстек.
...
Рейтинг: 0 / 0
22.09.2022, 08:08
    #158973
Просто Трёп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача для срача
В аттаче вирус!
...
Рейтинг: 1 / 0
Нравится: Green
22.09.2022, 08:11
    #158977
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача для срача
Просто Трёп  22.09.2022, 08:08
[игнорируется]
В аттаче вирус!
он заразил блокнот буквами!
...
Рейтинг: 0 / 0
22.09.2022, 08:14
    #158983
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача для срача
Doublekey  22.09.2022, 07:39
[игнорируется]
Задачка в аттаче. На мой взгляд весьма неоднозначная.
тестовое задание (1).sql
я бы добавил 3й вопрос на совсем засыпку: нахуя в задании первая таблица?
...
Рейтинг: 0 / 0
22.09.2022, 08:16
    #158984
Горбатый ёж
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача для срача
Doublekey  22.09.2022, 07:39
[игнорируется]
На мой взгляд весьма неоднозначная.
Что в ней неоднозначного?
...
Рейтинг: 0 / 0
22.09.2022, 08:17
    #158988
Горбатый ёж
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача для срача
Antonariy  22.09.2022, 08:14
[игнорируется]
я бы добавил 3й вопрос на совсем засыпку: нахуя в задании первая таблица?
Для примера она, типа она для логирования.
Но вопрос конечно интересный, ибо эту таблицу логируем, а триггер на абстрактной таблице висит.
...
Рейтинг: 0 / 0
22.09.2022, 08:18
    #158989
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача для срача
Script Date: 31.08.2021 10:46:02

потребуй посвежее!
...
Рейтинг: 0 / 0
22.09.2022, 08:21
    #158991
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача для срача
Горбатый ёж  22.09.2022, 08:17
[игнорируется]
Antonariy  22.09.2022, 08:14
[игнорируется]
я бы добавил 3й вопрос на совсем засыпку: нахуя в задании первая таблица?
Для примера она, типа она для логирования.
Но вопрос конечно интересный, ибо эту таблицу логируем, а триггер на абстрактной таблице висит.
а может это ответ на второй вопрос? в триггере нужно поменять SomeAbstractTable на TablesForLogging!
...
Рейтинг: 0 / 0
22.09.2022, 08:22
    #158992
Горбатый ёж
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача для срача
Antonariy  22.09.2022, 08:21
[игнорируется]
а может это ответ на второй вопрос? в триггере нужно поменять SomeAbstractTable на TablesForLogging!
Возможно.
Помимо вопроса к 1 таблице у меня ещё вопрос, действительно ли данные в логируемую таблицу только вставляются и удаляются, или нас просто не интересует апдейт.
...
Рейтинг: 0 / 0
22.09.2022, 08:24
    #158994
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача для срача
Горбатый ёж  22.09.2022, 08:22
[игнорируется]
Antonariy  22.09.2022, 08:21
[игнорируется]
а может это ответ на второй вопрос? в триггере нужно поменять SomeAbstractTable на TablesForLogging!
Возможно.
Помимо вопроса к 1 таблице у меня ещё вопрос, действительно ли данные в логируемую таблицу только вставляются и удаляются, или нас просто не интересует апдейт.
или нужно добавить в триггер проверку, что SomeAbstractTable есть в конфигах. может триггер узнать имя таблицы, на которой висит?
...
Рейтинг: 0 / 0
22.09.2022, 08:28
    #158998
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача для срача
Горбатый ёж  22.09.2022, 08:22
[игнорируется]
действительно ли данные в логируемую таблицу только вставляются и удаляются, или нас просто не интересует апдейт.
чего это не интересует? AFTER DELETE,UPDATE,INSERT

а inserted называется одинаково и для обновления и для вставки.

этот нюанс нужно учесть в процедуре восстановления - проверить, что в целевой таблице есть запись с id и если есть, обновить данными из лога, или вставить.
...
Рейтинг: 0 / 0
22.09.2022, 08:32
    #159000
Горбатый ёж
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача для срача
Antonariy  22.09.2022, 08:28
[игнорируется]
inserted называется одинаково и для обновления и для вставки.

этот нюанс нужно учесть в процедуре восстановления - проверить, что в целевой таблице есть запись с id и если есть, обновить данными из лога, или вставить.
Откат инсёрта - это удаление.
И если у тебя запись есть, то её надо удалить.
...
Рейтинг: 0 / 0
22.09.2022, 08:34
    #159002
Горбатый ёж
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача для срача
Горбатый ёж  22.09.2022, 08:32
[игнорируется]
Antonariy  22.09.2022, 08:28
[игнорируется]
inserted называется одинаково и для обновления и для вставки.

этот нюанс нужно учесть в процедуре восстановления - проверить, что в целевой таблице есть запись с id и если есть, обновить данными из лога, или вставить.
Откат инсёрта - это удаление.
И если у тебя запись есть, то её надо удалить.
Тогда получается, что надо искать более раннюю запись среди инсёртов, если она есть, то это изменение и данные восстанавливать из более ранней записи.
...
Рейтинг: 0 / 0
22.09.2022, 08:51
    #159007
Green
Green 
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача для срача
Просто Трёп  22.09.2022, 08:08
[игнорируется]
В аттаче вирус!
Не хочу открывать.
...
Рейтинг: 0 / 0
22.09.2022, 09:03
    #159014
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача для срача
Горбатый ёж  22.09.2022, 08:34
[игнорируется]
Горбатый ёж  22.09.2022, 08:32
[игнорируется]
Antonariy  22.09.2022, 08:28
[игнорируется]
inserted называется одинаково и для обновления и для вставки.

этот нюанс нужно учесть в процедуре восстановления - проверить, что в целевой таблице есть запись с id и если есть, обновить данными из лога, или вставить.
Откат инсёрта - это удаление.
И если у тебя запись есть, то её надо удалить.
Тогда получается, что надо искать более раннюю запись среди инсёртов, если она есть, то это изменение и данные восстанавливать из более ранней записи.
Логично
...
Рейтинг: 0 / 0
22.09.2022, 09:12
    #159016
Doublekey
Участник
[скрыт]
[заблокирован]
Поместить в игнор-лист Сообщения автора в теме
Задача для срача
Есть такое хранилище логов
USE [LogDB]
GO

/****** Object: Table [dbo].[tablesForLogging] Script Date: 31.08.2021 10:45:47 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

-- конфиг таблицы, что логируем
CREATE TABLE [dbo].[tablesForLogging](
[BaseName] [nvarchar](50) NULL,
[tableName] [nvarchar](50) NULL,
[Field_Key] [nvarchar](100) NULL,
[is_active] [bit] NULL,
[Storage] [int] NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[tablesForLogging] ADD CONSTRAINT [DF_TablesForLogging_is_active] DEFAULT ((1)) FOR [is_active]
GO

USE [LogDB]
GO

/****** Object: Table [dbo].[tableLoggingData] Script Date: 31.08.2021 10:46:02 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

-- сами залогированные данные
CREATE TABLE [dbo].[tableLoggingData](
[id] [bigint] IDENTITY(1,1) NOT NULL,
[Base_ID] [bigint] NOT NULL,
[table_ID] [bigint] NOT NULL,
[DateAdd] [datetime] NOT NULL,
[is_type] [bit] NOT NULL,
[HostName] [varchar](100) NULL,
[ProgramName] [varchar](100) NULL,
[Proc_ID] [bigint] NULL,
[SystemUser] [varchar](50) NULL,
[Str_json] [nvarchar](max) NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

GO

Use [SomeAbstractDB]
go
на какой-то абстрактной таблице есть триггер
CREATE TRIGGER [dbo].[LogAction_tt_online_services] ON [dbo].[SomeAbstractTable] AFTER DELETE,UPDATE,INSERT
AS
BEGIN
IF EXISTS (SELECT * FROM deleted)
BEGIN
INSERT INTO LogDB.dbo.TableLoggingData
(Base_ID, Table_ID, [DateAdd], is_type, HostName, ProgramName, Proc_ID, SystemUser, Str_json)
SELECT 23, 485330533, GETDATE(), 1, HOST_NAME(), PROGRAM_NAME(),
@@PROCID, SYSTEM_USER, (SELECT D.* FOR JSON PATH)
FROM deleted D
END
IF EXISTS (SELECT * FROM inserted) AND NOT EXISTS(SELECT * FROM deleted)
BEGIN
INSERT INTO LogDB.dbo.TableLoggingData
(Base_ID, Table_ID, [DateAdd], is_type, HostName, ProgramName, Proc_ID, SystemUser, Str_json)
SELECT 23, 485330533, GETDATE(), 0, HOST_NAME(), PROGRAM_NAME(),
@@PROCID, SYSTEM_USER, (SELECT I.* FOR JSON PATH)
FROM inserted I
END
END

Задача:
1) Сделать процедуру восстановления данных, которая на вход принимает айдишник из таблицы TableLoggingData и в целевой таблице восстанавливает запись
2) Может что-то можно\нужно изменить в триггере ?
...
Рейтинг: 0 / 0
22.09.2022, 09:14
    #159017
Просто Трёп
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача для срача
Green  22.09.2022, 08:51
[игнорируется]
Просто Трёп  22.09.2022, 08:08
[игнорируется]
В аттаче вирус!
Не хочу открывать.
Ты побежден!
...
Рейтинг: 0 / 0
22.09.2022, 10:41
    #159138
eNose
Участник
[не активирован]
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача для срача
Doublekey  22.09.2022, 09:12
[игнорируется]
Задача:
1) Сделать процедуру восстановления данных, которая на вход принимает айдишник из таблицы TableLoggingData и в целевой таблице восстанавливает запись
хуйня вопрос

за деньги

зы: не забудь перед восстановлением отключить нахуй триггер
...
Рейтинг: 0 / 0
22.09.2022, 10:46
    #159148
eNose
Участник
[не активирован]
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача для срача
Doublekey  22.09.2022, 09:12
[игнорируется]
2) Может что-то можно\нужно изменить в триггере ?
да, нужно

логи они как бы не для восстановления, а для анализа.
для восстановления гораздо удобнее использовать другие механизмы. например бэкапы.
Doublekey  22.09.2022, 09:12
[игнорируется]
1) Сделать процедуру восстановления данных, которая на вход принимает айдишник из таблицы TableLoggingData и в целевой таблице восстанавливает запись
а ДАТУ ВРЕМЯ с которой восстанавливать - передать не хочешь?
...
Рейтинг: 0 / 0
22.09.2022, 10:46
    #159151
eNose
Участник
[не активирован]
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача для срача
в общем без озвучивания количества тысяч рублей задача ниххуя неинтересная
...
Рейтинг: 0 / 0
22.09.2022, 11:03
    #159203
Doublekey
Участник
[скрыт]
[заблокирован]
Поместить в игнор-лист Сообщения автора в теме
Задача для срача
eNose  22.09.2022, 10:41
[игнорируется]
Doublekey  22.09.2022, 09:12
[игнорируется]
Задача:
1) Сделать процедуру восстановления данных, которая на вход принимает айдишник из таблицы TableLoggingData и в целевой таблице восстанавливает запись
хуйня вопрос

за деньги

зы: не забудь перед восстановлением отключить нахуй триггер
это тестовое задание гы
...
Рейтинг: 0 / 0
22.09.2022, 11:04
    #159205
Doublekey
Участник
[скрыт]
[заблокирован]
Поместить в игнор-лист Сообщения автора в теме
Задача для срача
eNose  22.09.2022, 10:46
[игнорируется]
Doublekey  22.09.2022, 09:12
[игнорируется]
2) Может что-то можно\нужно изменить в триггере ?
да, нужно

логи они как бы не для восстановления, а для анализа.
для восстановления гораздо удобнее использовать другие механизмы. например бэкапы.
Doublekey  22.09.2022, 09:12
[игнорируется]
1) Сделать процедуру восстановления данных, которая на вход принимает айдишник из таблицы TableLoggingData и в целевой таблице восстанавливает запись
а ДАТУ ВРЕМЯ с которой восстанавливать - передать не хочешь?
ну это не мое задание там есть много тонких непонятных моментов а восстановление у них ОДНОЙ записи по ID зачем там дата?
...
Рейтинг: 0 / 0
22.09.2022, 11:06
    #159212
eNose
Участник
[не активирован]
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача для срача
Doublekey  22.09.2022, 11:04
[игнорируется]
eNose  22.09.2022, 10:46
[игнорируется]
Doublekey  22.09.2022, 09:12
[игнорируется]
2) Может что-то можно\нужно изменить в триггере ?
да, нужно

логи они как бы не для восстановления, а для анализа.
для восстановления гораздо удобнее использовать другие механизмы. например бэкапы.
Doublekey  22.09.2022, 09:12
[игнорируется]
1) Сделать процедуру восстановления данных, которая на вход принимает айдишник из таблицы TableLoggingData и в целевой таблице восстанавливает запись
а ДАТУ ВРЕМЯ с которой восстанавливать - передать не хочешь?
ну это не мое задание там есть много тонких непонятных моментов а восстановление у них ОДНОЙ записи по ID зачем там дата?
с одной неинтересно
...
Рейтинг: 0 / 0
22.09.2022, 11:09
    #159228
eNose
Участник
[не активирован]
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача для срача
Doublekey  22.09.2022, 11:04
[игнорируется]
там есть много тонких непонятных моментов
как по таблице tablesForLogging создать скрипт для восстановления и заполнить его данными из tableLoggingData?

это тебе непонятно или что-то еще?
...
Рейтинг: 0 / 0
22.09.2022, 11:34
    #159273
Doublekey
Участник
[скрыт]
[заблокирован]
Поместить в игнор-лист Сообщения автора в теме
Задача для срача
eNose  22.09.2022, 11:09
[игнорируется]
Doublekey  22.09.2022, 11:04
[игнорируется]
там есть много тонких непонятных моментов
как по таблице tablesForLogging создать скрипт для восстановления и заполнить его данными из tableLoggingData?

это тебе непонятно или что-то еще?
Все там понятно, просто убогая архитектура и куча дырок. Задача чисто синтетического плана.
Собственнно что я им ответил

[23:07, 21.09.2022] Konstantin: я им сказал что архитектура которая вынуждает заниматься динамическими скулями убогая. и решение хоть и есть тоже неэффективное. и что решить можно но не хотелось бы потому я не согласен с таким универсальным архитектурным решением
[23:07, 21.09.2022] Konstantin: касаемо триггера, я обычно правда не любил когда в лог попадают и инсерты тоже. потому как как там правильно показано приходится по типам различать. но над ним может надо подумать отдельно. но скажем если дают ID записи вставки именно новой строки то есть типа 0 то ее нет смысла восстанавливать потому что когда она была одна она не менялась, а когда в строке целевой таблицы что то изменится появится еще одна строка лога и ее надо будет восстанавливать. вообще я не считаю правильным в одном логе хранить и данные совпадающие со строкой логированной таблицы и и ее старые данные. если необходимо хранить факт инсерта и нельзя его отметить через InsertDate в целевой таблице то стоит хранить думаю ПЕРВУЮ запись в виде NULL в джисоновском поле. но это личное мое мнение
[23:08, 21.09.2022] Konstantin: асаемо организации то что мне не очень нравится подобное логирование в JSON потому что усложняет восприятие хотя и дает универсиализацию это наверно лично мое мнение может чем то это и хорошо, хотя я сомневаюсь что тяжелые варчары это хорошо. скорее вопрос в другом. разворачивание JSON-А OpenSON-ом это известная вещь. но там надо ЗАРАНЕЕ знать имена колонок и пути в файле соответственно. если этого не знать то мы получим столбец имен колонок значений и типов потом мы можем развернуть это в две строчки функцией и использовать динамический SQL далее для добавления (тем более что все равно мы изначально не знаем имени таблицы и базы)
[23:08, 21.09.2022] Konstantin: динамический скуль это вообще не очень хорошо он имеет неприятные нюансы . кроме того у нас в логе есть ID и больше этого ID нигде нет. если мы решили забиццо на ID то можно использовать системные sys.all_objects и sys.databases.
[23:08, 21.09.2022] Konstantin: если ID в целевой таблице это Identity то вставка в это поле возможно только при предварительном запуске специальной директивы. (если запись скажем уже удалена) таким образом решение как будто искуственно усложнено чтобы понять что человек знает о джисоне и динамическом скуле. но с точки зрения продуктива я такие решения как человек с 20 летним опытом не одобряю ибо унификация хорошо но тут она на мой взгляд дается слишком большой ценой. Но если в данном случае это жесткая идея я попробую вам описанное выразить в коде. но повторюсь. я считаю это технологически и архитектурно неправильным решением
[23:08, 21.09.2022] Konstantin: И кстати еще на тему триггера и аудита. Смысл аудита/лога в чем? фиксировать изменения в таблице которые так или иначе в целевой таблице будут утрачены. таким образом рассмотрим ситуацию. Предположим что для однообразия мы будем хранить в таблице лога только ПРЕДЫДУЩИЕ данные, это отлично подходит для апдейта и делита. ВОпрос с инсертом. для инсерта как таковых предыдущих данных нет и мы пишем скажем нулл. таким образом мы в логе фиксируем что некий процесс или пользователь внес изменения в целевую таблицу. а какие? а можно посмотреть в целевую таблицу, ведь мы и в случае апдейта и делита НЕ храним новые значения в логе они есть ТОЛЬКО в целевой таблице до тех пор пока не будут оттуда удалены или там изменены. Зачем для инсерта менять этот подход. Ладно можем возразить а ведь кто то изменит эти данные и мы не узнаем больше что вставлял ТОТ САМЫЙ ПЕРВЫЙ. Не-а УЗНАЕМ потому что ТА САМАЯ ПЕРВАЯ запись будет положена в лог при первом же изменении. это ЛОГ ИЗМЕНЕНИЙ!! он не решает задачу восстановления данных после транкейта таблицы. для этого должны быть бэкапы.
...
Рейтинг: 0 / 0
22.09.2022, 11:38
    #159279
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача для срача
Doublekey  22.09.2022, 11:34
[игнорируется]
eNose  22.09.2022, 11:09
[игнорируется]
Doublekey  22.09.2022, 11:04
[игнорируется]
там есть много тонких непонятных моментов
как по таблице tablesForLogging создать скрипт для восстановления и заполнить его данными из tableLoggingData?

это тебе непонятно или что-то еще?
Все там понятно, просто убогая архитектура и куча дырок. Задача чисто синтетического плана.
Собственнно что я им ответил

[23:07, 21.09.2022] Konstantin: я им сказал что архитектура которая вынуждает заниматься динамическими скулями убогая. и решение хоть и есть тоже неэффективное. и что решить можно но не хотелось бы потому я не согласен с таким универсальным архитектурным решением
[23:07, 21.09.2022] Konstantin: касаемо триггера, я обычно правда не любил когда в лог попадают и инсерты тоже. потому как как там правильно показано приходится по типам различать. но над ним может надо подумать отдельно. но скажем если дают ID записи вставки именно новой строки то есть типа 0 то ее нет смысла восстанавливать потому что когда она была одна она не менялась, а когда в строке целевой таблицы что то изменится появится еще одна строка лога и ее надо будет восстанавливать. вообще я не считаю правильным в одном логе хранить и данные совпадающие со строкой логированной таблицы и и ее старые данные. если необходимо хранить факт инсерта и нельзя его отметить через InsertDate в целевой таблице то стоит хранить думаю ПЕРВУЮ запись в виде NULL в джисоновском поле. но это личное мое мнение
[23:08, 21.09.2022] Konstantin: асаемо организации то что мне не очень нравится подобное логирование в JSON потому что усложняет восприятие хотя и дает универсиализацию это наверно лично мое мнение может чем то это и хорошо, хотя я сомневаюсь что тяжелые варчары это хорошо. скорее вопрос в другом. разворачивание JSON-А OpenSON-ом это известная вещь. но там надо ЗАРАНЕЕ знать имена колонок и пути в файле соответственно. если этого не знать то мы получим столбец имен колонок значений и типов потом мы можем развернуть это в две строчки функцией и использовать динамический SQL далее для добавления (тем более что все равно мы изначально не знаем имени таблицы и базы)
[23:08, 21.09.2022] Konstantin: динамический скуль это вообще не очень хорошо он имеет неприятные нюансы . кроме того у нас в логе есть ID и больше этого ID нигде нет. если мы решили забиццо на ID то можно использовать системные sys.all_objects и sys.databases.
[23:08, 21.09.2022] Konstantin: если ID в целевой таблице это Identity то вставка в это поле возможно только при предварительном запуске специальной директивы. (если запись скажем уже удалена) таким образом решение как будто искуственно усложнено чтобы понять что человек знает о джисоне и динамическом скуле. но с точки зрения продуктива я такие решения как человек с 20 летним опытом не одобряю ибо унификация хорошо но тут она на мой взгляд дается слишком большой ценой. Но если в данном случае это жесткая идея я попробую вам описанное выразить в коде. но повторюсь. я считаю это технологически и архитектурно неправильным решением
[23:08, 21.09.2022] Konstantin: И кстати еще на тему триггера и аудита. Смысл аудита/лога в чем? фиксировать изменения в таблице которые так или иначе в целевой таблице будут утрачены. таким образом рассмотрим ситуацию. Предположим что для однообразия мы будем хранить в таблице лога только ПРЕДЫДУЩИЕ данные, это отлично подходит для апдейта и делита. ВОпрос с инсертом. для инсерта как таковых предыдущих данных нет и мы пишем скажем нулл. таким образом мы в логе фиксируем что некий процесс или пользователь внес изменения в целевую таблицу. а какие? а можно посмотреть в целевую таблицу, ведь мы и в случае апдейта и делита НЕ храним новые значения в логе они есть ТОЛЬКО в целевой таблице до тех пор пока не будут оттуда удалены или там изменены. Зачем для инсерта менять этот подход. Ладно можем возразить а ведь кто то изменит эти данные и мы не узнаем больше что вставлял ТОТ САМЫЙ ПЕРВЫЙ. Не-а УЗНАЕМ потому что ТА САМАЯ ПЕРВАЯ запись будет положена в лог при первом же изменении. это ЛОГ ИЗМЕНЕНИЙ!! он не решает задачу восстановления данных после транкейта таблицы. для этого должны быть бэкапы.
"ваше задание говно" - по-моему решил на отлично, я б взял такого спеца.
...
Рейтинг: 0 / 0
22.09.2022, 11:40
    #159282
Doublekey
Участник
[скрыт]
[заблокирован]
Поместить в игнор-лист Сообщения автора в теме
Задача для срача
eNose  22.09.2022, 11:09
[игнорируется]
Doublekey  22.09.2022, 11:04
[игнорируется]
там есть много тонких непонятных моментов
как по таблице tablesForLogging создать скрипт для восстановления и заполнить его данными из tableLoggingData?

это тебе непонятно или что-то еще?
А вот твоя фраза непонятно tablesForLogging это у них таблица где они перечисляют какие таблицы логируются.
база-таблица-первичный ключ- активность логирования но если ты заметишь она не связана с tableLoggingData ключами
если только ID Это не имя таблицы гыыы Так что использовать ее для чего либо невозможно.

были бы там какие то связующие ключи да. можно было данные использовать из лога. а таблицу базу искать в этой таблице.
а сейчас как предлагаешь сопоставить ID таблицы из лога с именем таблицы в той таблице?
...
Рейтинг: 0 / 0
22.09.2022, 11:41
    #159285
Doublekey
Участник
[скрыт]
[заблокирован]
Поместить в игнор-лист Сообщения автора в теме
Задача для срача
Antonariy  22.09.2022, 11:38
[игнорируется]
Doublekey  22.09.2022, 11:34
[игнорируется]
eNose  22.09.2022, 11:09
[игнорируется]
Doublekey  22.09.2022, 11:04
[игнорируется]
там есть много тонких непонятных моментов
как по таблице tablesForLogging создать скрипт для восстановления и заполнить его данными из tableLoggingData?

это тебе непонятно или что-то еще?
Все там понятно, просто убогая архитектура и куча дырок. Задача чисто синтетического плана.
Собственнно что я им ответил

[23:07, 21.09.2022] Konstantin: я им сказал что архитектура которая вынуждает заниматься динамическими скулями убогая. и решение хоть и есть тоже неэффективное. и что решить можно но не хотелось бы потому я не согласен с таким универсальным архитектурным решением
[23:07, 21.09.2022] Konstantin: касаемо триггера, я обычно правда не любил когда в лог попадают и инсерты тоже. потому как как там правильно показано приходится по типам различать. но над ним может надо подумать отдельно. но скажем если дают ID записи вставки именно новой строки то есть типа 0 то ее нет смысла восстанавливать потому что когда она была одна она не менялась, а когда в строке целевой таблицы что то изменится появится еще одна строка лога и ее надо будет восстанавливать. вообще я не считаю правильным в одном логе хранить и данные совпадающие со строкой логированной таблицы и и ее старые данные. если необходимо хранить факт инсерта и нельзя его отметить через InsertDate в целевой таблице то стоит хранить думаю ПЕРВУЮ запись в виде NULL в джисоновском поле. но это личное мое мнение
[23:08, 21.09.2022] Konstantin: асаемо организации то что мне не очень нравится подобное логирование в JSON потому что усложняет восприятие хотя и дает универсиализацию это наверно лично мое мнение может чем то это и хорошо, хотя я сомневаюсь что тяжелые варчары это хорошо. скорее вопрос в другом. разворачивание JSON-А OpenSON-ом это известная вещь. но там надо ЗАРАНЕЕ знать имена колонок и пути в файле соответственно. если этого не знать то мы получим столбец имен колонок значений и типов потом мы можем развернуть это в две строчки функцией и использовать динамический SQL далее для добавления (тем более что все равно мы изначально не знаем имени таблицы и базы)
[23:08, 21.09.2022] Konstantin: динамический скуль это вообще не очень хорошо он имеет неприятные нюансы . кроме того у нас в логе есть ID и больше этого ID нигде нет. если мы решили забиццо на ID то можно использовать системные sys.all_objects и sys.databases.
[23:08, 21.09.2022] Konstantin: если ID в целевой таблице это Identity то вставка в это поле возможно только при предварительном запуске специальной директивы. (если запись скажем уже удалена) таким образом решение как будто искуственно усложнено чтобы понять что человек знает о джисоне и динамическом скуле. но с точки зрения продуктива я такие решения как человек с 20 летним опытом не одобряю ибо унификация хорошо но тут она на мой взгляд дается слишком большой ценой. Но если в данном случае это жесткая идея я попробую вам описанное выразить в коде. но повторюсь. я считаю это технологически и архитектурно неправильным решением
[23:08, 21.09.2022] Konstantin: И кстати еще на тему триггера и аудита. Смысл аудита/лога в чем? фиксировать изменения в таблице которые так или иначе в целевой таблице будут утрачены. таким образом рассмотрим ситуацию. Предположим что для однообразия мы будем хранить в таблице лога только ПРЕДЫДУЩИЕ данные, это отлично подходит для апдейта и делита. ВОпрос с инсертом. для инсерта как таковых предыдущих данных нет и мы пишем скажем нулл. таким образом мы в логе фиксируем что некий процесс или пользователь внес изменения в целевую таблицу. а какие? а можно посмотреть в целевую таблицу, ведь мы и в случае апдейта и делита НЕ храним новые значения в логе они есть ТОЛЬКО в целевой таблице до тех пор пока не будут оттуда удалены или там изменены. Зачем для инсерта менять этот подход. Ладно можем возразить а ведь кто то изменит эти данные и мы не узнаем больше что вставлял ТОТ САМЫЙ ПЕРВЫЙ. Не-а УЗНАЕМ потому что ТА САМАЯ ПЕРВАЯ запись будет положена в лог при первом же изменении. это ЛОГ ИЗМЕНЕНИЙ!! он не решает задачу восстановления данных после транкейта таблицы. для этого должны быть бэкапы.
"ваше задание говно" - по-моему решил на отлично, я б взял такого спеца.
именно это я и пытался им сказать. что задача решаема через OPENJSON функция разворота выборки в строчку через запятую и динамический скуль. можно еще использовать системные таблички. но в реальной жизни я против таких извратов. потому что динамический скуль нее т что надо насаждать
...
Рейтинг: 0 / 0
22.09.2022, 12:30
    #159354
Дед-Папыхтет
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача для срача
Doublekey  22.09.2022, 11:34
[игнорируется]
eNose  22.09.2022, 11:09
[игнорируется]
Doublekey  22.09.2022, 11:04
[игнорируется]
там есть много тонких непонятных моментов
как по таблице tablesForLogging создать скрипт для восстановления и заполнить его данными из tableLoggingData?

это тебе непонятно или что-то еще?
Все там понятно, просто убогая архитектура и куча дырок. Задача чисто синтетического плана.
Собственнно что я им ответил

[23:07, 21.09.2022] Konstantin: я им сказал что архитектура которая вынуждает заниматься динамическими скулями убогая. и решение хоть и есть тоже неэффективное. и что решить можно но не хотелось бы потому я не согласен с таким универсальным архитектурным решением
[23:07, 21.09.2022] Konstantin: касаемо триггера, я обычно правда не любил когда в лог попадают и инсерты тоже. потому как как там правильно показано приходится по типам различать. но над ним может надо подумать отдельно. но скажем если дают ID записи вставки именно новой строки то есть типа 0 то ее нет смысла восстанавливать потому что когда она была одна она не менялась, а когда в строке целевой таблицы что то изменится появится еще одна строка лога и ее надо будет восстанавливать. вообще я не считаю правильным в одном логе хранить и данные совпадающие со строкой логированной таблицы и и ее старые данные. если необходимо хранить факт инсерта и нельзя его отметить через InsertDate в целевой таблице то стоит хранить думаю ПЕРВУЮ запись в виде NULL в джисоновском поле. но это личное мое мнение
[23:08, 21.09.2022] Konstantin: асаемо организации то что мне не очень нравится подобное логирование в JSON потому что усложняет восприятие хотя и дает универсиализацию это наверно лично мое мнение может чем то это и хорошо, хотя я сомневаюсь что тяжелые варчары это хорошо. скорее вопрос в другом. разворачивание JSON-А OpenSON-ом это известная вещь. но там надо ЗАРАНЕЕ знать имена колонок и пути в файле соответственно. если этого не знать то мы получим столбец имен колонок значений и типов потом мы можем развернуть это в две строчки функцией и использовать динамический SQL далее для добавления (тем более что все равно мы изначально не знаем имени таблицы и базы)
[23:08, 21.09.2022] Konstantin: динамический скуль это вообще не очень хорошо он имеет неприятные нюансы . кроме того у нас в логе есть ID и больше этого ID нигде нет. если мы решили забиццо на ID то можно использовать системные sys.all_objects и sys.databases.
[23:08, 21.09.2022] Konstantin: если ID в целевой таблице это Identity то вставка в это поле возможно только при предварительном запуске специальной директивы. (если запись скажем уже удалена) таким образом решение как будто искуственно усложнено чтобы понять что человек знает о джисоне и динамическом скуле. но с точки зрения продуктива я такие решения как человек с 20 летним опытом не одобряю ибо унификация хорошо но тут она на мой взгляд дается слишком большой ценой. Но если в данном случае это жесткая идея я попробую вам описанное выразить в коде. но повторюсь. я считаю это технологически и архитектурно неправильным решением
[23:08, 21.09.2022] Konstantin: И кстати еще на тему триггера и аудита. Смысл аудита/лога в чем? фиксировать изменения в таблице которые так или иначе в целевой таблице будут утрачены. таким образом рассмотрим ситуацию. Предположим что для однообразия мы будем хранить в таблице лога только ПРЕДЫДУЩИЕ данные, это отлично подходит для апдейта и делита. ВОпрос с инсертом. для инсерта как таковых предыдущих данных нет и мы пишем скажем нулл. таким образом мы в логе фиксируем что некий процесс или пользователь внес изменения в целевую таблицу. а какие? а можно посмотреть в целевую таблицу, ведь мы и в случае апдейта и делита НЕ храним новые значения в логе они есть ТОЛЬКО в целевой таблице до тех пор пока не будут оттуда удалены или там изменены. Зачем для инсерта менять этот подход. Ладно можем возразить а ведь кто то изменит эти данные и мы не узнаем больше что вставлял ТОТ САМЫЙ ПЕРВЫЙ. Не-а УЗНАЕМ потому что ТА САМАЯ ПЕРВАЯ запись будет положена в лог при первом же изменении. это ЛОГ ИЗМЕНЕНИЙ!! он не решает задачу восстановления данных после транкейта таблицы. для этого должны быть бэкапы.
Вопрос на подумать )))
Что ты будешь восстанавливать и как например при таких изменениях в логируемой таблице? (добавь еще поле name к примеру и не меняй его - для формирования полного ответа, или частично меняй)
Спойлер
Код: SQL
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
drop table if exists dbo.test;
create table dbo.test(id int primary key);
insert dbo.test values (1),(2),(3),(4);

--- здесь триггер логирования и таблица логирования

select * from dbo.test;

with cte as
(
  select id,
    new_id = iif(id=1,max(id) over (),id-1)
  from dbo.test
)
update cte set id=new_id;

select * from dbo.test;
...
Изменено: 22.09.2022, 12:32 - Дед-Папыхтет
Рейтинг: 0 / 0
22.09.2022, 12:50
    #159381
Горбатый ёж
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача для срача
Doublekey [игнорируется] 

А чего ты до динамики докопался?
Восстановление данных по логам операция редкая, а значит динамика или нет - похую.
Так же я не понял твоей претензии к ID. Не вижу принципиальной необходимости в замене суррогатного ключа на sys.all_objects и sys.databases (кстати, в МС скуле есть sys? я не в курсе просто)
...
Рейтинг: 1 / 0
Нравится: Дед-Папыхтет
22.09.2022, 13:12
    #159452
Doublekey
Участник
[скрыт]
[заблокирован]
Поместить в игнор-лист Сообщения автора в теме
Задача для срача
Горбатый ёж  22.09.2022, 12:50
[игнорируется]
Doublekey [игнорируется] 

А чего ты до динамики докопался?
Восстановление данных по логам операция редкая, а значит динамика или нет - похую.
Так же я не понял твоей претензии к ID. Не вижу принципиальной необходимости в замене суррогатного ключа на sys.all_objects и sys.databases (кстати, в МС скуле есть sys? я не в курсе просто)
у них вообще нет ключа. в таблице логируемых таблиц есть ИМЯ базы таблицы и первичного ключа в таблице.
самого сопоставления нет. докопался я частности до ID в таблице где надо восстановить там возможно оно идентити.

а ключ только в логе а куда он идет?
У меня основная претензия к ненужной универсиализации. зачем делать на сотни таблиц один лог?
...
Рейтинг: 0 / 0
22.09.2022, 13:14
    #159462
Горбатый ёж
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача для срача
Doublekey  22.09.2022, 13:12
[игнорируется]
У меня основная претензия к ненужной универсиализации. зачем делать на сотни таблиц один лог?
У другого может встать вопрос к тебе, а зачем сотни таблиц логов?
...
Рейтинг: 0 / 0
22.09.2022, 13:57
    #159535
Doublekey
Участник
[скрыт]
[заблокирован]
Поместить в игнор-лист Сообщения автора в теме
Задача для срача
Горбатый ёж  22.09.2022, 13:14
[игнорируется]
Doublekey  22.09.2022, 13:12
[игнорируется]
У меня основная претензия к ненужной универсиализации. зачем делать на сотни таблиц один лог?
У другого может встать вопрос к тебе, а зачем сотни таблиц логов?
потому что во первых так удобнее смотреть информацию по каждой табличке свой обьект
потому что тогда не надо хранить содержимое табличек в джисонах или в режиме поле-значение
что облегчает извлечение.
потому что это вообще ускоряет работу с аудитом
ну и терабайтная таблица она все равно терабайтная как ни крути. поэтому я против такой неудобной универсиализации.

но дело вкуса.
...
Рейтинг: 0 / 0
22.09.2022, 14:13
    #159552
Дед-Папыхтет
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача для срача
Doublekey  22.09.2022, 13:57
[игнорируется]
Горбатый ёж  22.09.2022, 13:14
[игнорируется]
Doublekey  22.09.2022, 13:12
[игнорируется]
У меня основная претензия к ненужной универсиализации. зачем делать на сотни таблиц один лог?
У другого может встать вопрос к тебе, а зачем сотни таблиц логов?
потому что во первых так удобнее смотреть информацию по каждой табличке свой обьект
потому что тогда не надо хранить содержимое табличек в джисонах или в режиме поле-значение
что облегчает извлечение.
потому что это вообще ускоряет работу с аудитом
ну и терабайтная таблица она все равно терабайтная как ни крути. поэтому я против такой неудобной универсиализации.

но дело вкуса.
На мой взгляд универсализация имеет место быть иногда.
Минусы - тормознее из за динамического sql,
Плюсы - меньше объектов и схожего кода.

Ну триггера сами без универсализации - сохраняется select * from inserted for fson path - это быстро и збсь. Динамика при парсинге - это тормознее немного да, но как писал йожыг выше - это оправдано если это редкие операции.
Ща тоже в ВТБ, проектируем справочник "финансовые инструменты" - бл разные инструменты в один справочник хуярят и акции и валюты и паи и ресурсы и драгметаллы и возможно что то еще добавится. Здесь ну можно сделать класс/таблицу инструмент с общими полями, можно наследников (связь 1 к 1) заебенить для каждого индивидуального инструмента - пара сотен разных инструментов = столько же может чуть меньше таблиц.
В общем ушли к классике EAV (entity attribute values - паттерну), да где то динамика нужна. Захуячили универсальность с минусами да... добавятся новые аттрибуты - доп строка в очередной табличке и в EAV таблице эти аттрибуты будут добавляться - ну то есть таблица не широкая а unpivot - узкая... На это идём осознанно, ибо универсальность и не определенность пока очевиднее нежели хуячить для каждого типа фин-инструменты свои поля и свои обработчики всякие.

И кстати на тему динамики ну классика в OLTP даже помогает
Код: SQL
1.
2.
3.
4.
5.
select *
from ...
where
(field1=@param1 or @param1 is null) or
(field2=@param2 or @param2 is null)
здесь как правило оптимизатор скатывается в ебанину долгую. в мсскл помогает хинт option(recompile) но при очень частом вызове такого запроса - эта рекомпиляция сильно просаживает сервер. И какие варианты?
Код: SQL
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
if @param1 is null
  if @param2 is null
    select * from ...
  else -- @param2 not null
    select * from ... where field2=@param2
else -- @param1 not null
  if @param2 is null
    select * from ... where field1=@param1
  else -- @param2 not null and @param1 not null
    select * from ... where field1=@param1 and field2=@param2
или же
Код: SQL
1.
2.
3.
4.
declare @query varchar(max) = 'select * from ... where 1=1'
   + iif(@param1 is not null,' and field1=@param1')
   + iif(@param2 is not null,' and field1=@param2')
exec sp_executesql @query, N'@param1 type, @param2 type', @param1, @param2
1й вариант хорошо работает для 1-2х параметров, а представь 5-10 параметров это 2 в степени 5-10 - вариантов веток if then else. в общем здесь динамика однозначно. И это быстрее нежели оригинальный первый запрос.
...
Изменено: 22.09.2022, 14:15 - Дед-Папыхтет
Рейтинг: 0 / 0
22.09.2022, 15:03
    #159607
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача для срача
Горбатый ёж  22.09.2022, 12:50
[игнорируется]
кстати, в МС скуле есть sys? я не в курсе просто
есть
...
Рейтинг: 0 / 0
22.09.2022, 15:19
    #159629
Antonariy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача для срача
Дед-Папыхтет  22.09.2022, 14:13
[игнорируется]
Ща тоже в ВТБ, проектируем справочник "финансовые инструменты" - бл разные инструменты в один справочник хуярят и акции и валюты и паи и ресурсы и драгметаллы и возможно что то еще добавится.
Потому что эта ебаная срань в одних случаях функционирует как единый тип объекта, а в других как разные! Какие-то свойства одинаковые, а какие-то разные, и их сотни. Но я базы не касаюсь, даже не смотрел из любопытства, она на орацле. У меня серверное рест апи и я его дрочу клиентом.
pasted_image.png
...
Рейтинг: 0 / 0
17.01.2023, 13:44
    #274701
Администратор
Администратор
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Задача для срача
Тема была перенесена из форума 'Просто Трёп'.
...
Администратор:
Тема была перенесена из форума 'Просто Трёп'.
Рейтинг: 0 / 0
Форумы / SQL [закрыт для гостей] / Задача для срача / 38 сообщений из 38, показаны все 2 страниц
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали тему (1): Анонимы (1)
Читали форум (1): Анонимы (1)
Пользователи онлайн (47): Анонимы (41), Bing Bot, Yandex Bot, Tosh 1 мин., жЫвоглот 5 мин., Green 7 мин., Брюквенные годы 9 мин.
x
x
Закрыть


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