|
Задача для срача
|
|||
---|---|---|---|
#18+
там есть много тонких непонятных моментов это тебе непонятно или что-то еще? Собственнно что я им ответил [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: И кстати еще на тему триггера и аудита. Смысл аудита/лога в чем? фиксировать изменения в таблице которые так или иначе в целевой таблице будут утрачены. таким образом рассмотрим ситуацию. Предположим что для однообразия мы будем хранить в таблице лога только ПРЕДЫДУЩИЕ данные, это отлично подходит для апдейта и делита. ВОпрос с инсертом. для инсерта как таковых предыдущих данных нет и мы пишем скажем нулл. таким образом мы в логе фиксируем что некий процесс или пользователь внес изменения в целевую таблицу. а какие? а можно посмотреть в целевую таблицу, ведь мы и в случае апдейта и делита НЕ храним новые значения в логе они есть ТОЛЬКО в целевой таблице до тех пор пока не будут оттуда удалены или там изменены. Зачем для инсерта менять этот подход. Ладно можем возразить а ведь кто то изменит эти данные и мы не узнаем больше что вставлял ТОТ САМЫЙ ПЕРВЫЙ. Не-а УЗНАЕМ потому что ТА САМАЯ ПЕРВАЯ запись будет положена в лог при первом же изменении. это ЛОГ ИЗМЕНЕНИЙ!! он не решает задачу восстановления данных после транкейта таблицы. для этого должны быть бэкапы. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2022, 11:34 |
|
Задача для срача
|
|||
---|---|---|---|
#18+
там есть много тонких непонятных моментов это тебе непонятно или что-то еще? Собственнно что я им ответил [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: И кстати еще на тему триггера и аудита. Смысл аудита/лога в чем? фиксировать изменения в таблице которые так или иначе в целевой таблице будут утрачены. таким образом рассмотрим ситуацию. Предположим что для однообразия мы будем хранить в таблице лога только ПРЕДЫДУЩИЕ данные, это отлично подходит для апдейта и делита. ВОпрос с инсертом. для инсерта как таковых предыдущих данных нет и мы пишем скажем нулл. таким образом мы в логе фиксируем что некий процесс или пользователь внес изменения в целевую таблицу. а какие? а можно посмотреть в целевую таблицу, ведь мы и в случае апдейта и делита НЕ храним новые значения в логе они есть ТОЛЬКО в целевой таблице до тех пор пока не будут оттуда удалены или там изменены. Зачем для инсерта менять этот подход. Ладно можем возразить а ведь кто то изменит эти данные и мы не узнаем больше что вставлял ТОТ САМЫЙ ПЕРВЫЙ. Не-а УЗНАЕМ потому что ТА САМАЯ ПЕРВАЯ запись будет положена в лог при первом же изменении. это ЛОГ ИЗМЕНЕНИЙ!! он не решает задачу восстановления данных после транкейта таблицы. для этого должны быть бэкапы. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2022, 11:38 |
|
Задача для срача
|
|||
---|---|---|---|
#18+
там есть много тонких непонятных моментов это тебе непонятно или что-то еще? база-таблица-первичный ключ- активность логирования но если ты заметишь она не связана с tableLoggingData ключами если только ID Это не имя таблицы гыыы Так что использовать ее для чего либо невозможно. были бы там какие то связующие ключи да. можно было данные использовать из лога. а таблицу базу искать в этой таблице. а сейчас как предлагаешь сопоставить ID таблицы из лога с именем таблицы в той таблице? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2022, 11:40 |
|
Задача для срача
|
|||
---|---|---|---|
#18+
там есть много тонких непонятных моментов это тебе непонятно или что-то еще? Собственнно что я им ответил [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: И кстати еще на тему триггера и аудита. Смысл аудита/лога в чем? фиксировать изменения в таблице которые так или иначе в целевой таблице будут утрачены. таким образом рассмотрим ситуацию. Предположим что для однообразия мы будем хранить в таблице лога только ПРЕДЫДУЩИЕ данные, это отлично подходит для апдейта и делита. ВОпрос с инсертом. для инсерта как таковых предыдущих данных нет и мы пишем скажем нулл. таким образом мы в логе фиксируем что некий процесс или пользователь внес изменения в целевую таблицу. а какие? а можно посмотреть в целевую таблицу, ведь мы и в случае апдейта и делита НЕ храним новые значения в логе они есть ТОЛЬКО в целевой таблице до тех пор пока не будут оттуда удалены или там изменены. Зачем для инсерта менять этот подход. Ладно можем возразить а ведь кто то изменит эти данные и мы не узнаем больше что вставлял ТОТ САМЫЙ ПЕРВЫЙ. Не-а УЗНАЕМ потому что ТА САМАЯ ПЕРВАЯ запись будет положена в лог при первом же изменении. это ЛОГ ИЗМЕНЕНИЙ!! он не решает задачу восстановления данных после транкейта таблицы. для этого должны быть бэкапы. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2022, 11:41 |
|
Задача для срача
|
|||
---|---|---|---|
#18+
там есть много тонких непонятных моментов это тебе непонятно или что-то еще? Собственнно что я им ответил [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.
... |
|||
:
Изменено: 22.09.2022, 12:32 - Дед-Папыхтет
Нравится:
Не нравится:
|
|||
22.09.2022, 12:30 |
|
Задача для срача
|
|||
---|---|---|---|
#18+
У меня основная претензия к ненужной универсиализации. зачем делать на сотни таблиц один лог? ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2022, 13:14 |
|
Задача для срача
|
|||
---|---|---|---|
#18+
У меня основная претензия к ненужной универсиализации. зачем делать на сотни таблиц один лог? потому что тогда не надо хранить содержимое табличек в джисонах или в режиме поле-значение что облегчает извлечение. потому что это вообще ускоряет работу с аудитом ну и терабайтная таблица она все равно терабайтная как ни крути. поэтому я против такой неудобной универсиализации. но дело вкуса. ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2022, 13:57 |
|
Задача для срача
|
|||
---|---|---|---|
#18+
У меня основная претензия к ненужной универсиализации. зачем делать на сотни таблиц один лог? потому что тогда не надо хранить содержимое табличек в джисонах или в режиме поле-значение что облегчает извлечение. потому что это вообще ускоряет работу с аудитом ну и терабайтная таблица она все равно терабайтная как ни крути. поэтому я против такой неудобной универсиализации. но дело вкуса. Минусы - тормознее из за динамического sql, Плюсы - меньше объектов и схожего кода. Ну триггера сами без универсализации - сохраняется select * from inserted for fson path - это быстро и збсь. Динамика при парсинге - это тормознее немного да, но как писал йожыг выше - это оправдано если это редкие операции. Ща тоже в ВТБ, проектируем справочник "финансовые инструменты" - бл разные инструменты в один справочник хуярят и акции и валюты и паи и ресурсы и драгметаллы и возможно что то еще добавится. Здесь ну можно сделать класс/таблицу инструмент с общими полями, можно наследников (связь 1 к 1) заебенить для каждого индивидуального инструмента - пара сотен разных инструментов = столько же может чуть меньше таблиц. В общем ушли к классике EAV (entity attribute values - паттерну), да где то динамика нужна. Захуячили универсальность с минусами да... добавятся новые аттрибуты - доп строка в очередной табличке и в EAV таблице эти аттрибуты будут добавляться - ну то есть таблица не широкая а unpivot - узкая... На это идём осознанно, ибо универсальность и не определенность пока очевиднее нежели хуячить для каждого типа фин-инструменты свои поля и свои обработчики всякие. И кстати на тему динамики ну классика в OLTP даже помогает Код: SQL 1. 2. 3. 4. 5.
Код: SQL 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Код: SQL 1. 2. 3. 4.
... |
|||
:
Изменено: 22.09.2022, 14:15 - Дед-Папыхтет
Нравится:
Не нравится:
|
|||
22.09.2022, 14:13 |
|
Задача для срача
|
|||
---|---|---|---|
#18+
кстати, в МС скуле есть sys? я не в курсе просто ... |
|||
:
Нравится:
Не нравится:
|
|||
22.09.2022, 15:03 |
|
Задача для срача
#159629
Ссылка:
Ссылка на сообщение:
Ссылка с названием темы:
Ссылка на профиль пользователя:
Ссылка на вложение:
|
||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
#18+
Ща тоже в ВТБ, проектируем справочник "финансовые инструменты" - бл разные инструменты в один справочник хуярят и акции и валюты и паи и ресурсы и драгметаллы и возможно что то еще добавится. ... |
||||||||||||||||
:
Нравится:
Не нравится:
|
||||||||||||||||
22.09.2022, 15:19 |
|
|
start [/forum/topic.php?fid=32&msg=159629&tid=4705]: |
0ms |
get settings: |
23ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
42ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
940ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 1052ms |
0 / 0 |