Показать сообщение отдельно
Старый 06.07.2017, 11:30   #6  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,873 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Видели, что теперь администраторы не смогут данные править через обозреватель таблиц на live environments?
Проектировщики системы идут не в том направлении.
Они строят забор там, где в нем все равно проломят дыру и будут шастать туда и сюда. Потому что людям надо!
Бессмысленно строить забор так где нужен проход.

Правильнее было бы предусмотреть удобный механизм отката изменений.
Например в оракл есть удобный механизм флешбека.
Просто пишешь запрос
X++:
SELECT * FROM SCHEMA.TABLENAME /* AS OF TIMESTAMP TO_TIMESTAMP('2017-06-30 12:50:00', 'YYYY-MM-DD HH24:MI:SS') */ A
WHERE 
...
и видишь данные на любой момент времени.

Если к тебе прибежал испуганный программист/админ/юзер - шеф все пропало, гипс снимают, клиент уезжает "Я нечаянно удалил тучу данных!"
то просто берешь и пишешь

X++:
SELECT * FROM SCHEMA.TABLENAME /* AS OF TIMESTAMP TO_TIMESTAMP('2017-06-30 12:50:00', 'YYYY-MM-DD HH24:MI:SS') */ A
WHERE 
...
AND NOT EXISTS
    (
         SELECT 'x' FROM SCHEMA.TABLENAME
                B
         WHERE (
                    SUBSTR(NLS_LOWER(B.DATAAREAID),1,4) = SUBSTR(NLS_LOWER(A.DATAAREAID),1,4)
                     AND B.recid = A.recid
               )
    )
И видишь то что он грохнул.
Ну может выполняешь несколько раз этот запрос с перечнем полей count(*) на разную дату время чтобы поймать лучше момент времени с которого ндао взять удаленные впоследствии данные.

И затем восстанавливаешь их

X++:
INSERT INTO SCHEMA.TABLENAME
(
FIELD1, FIELD2 ...
) 

SELECT FIELD1, FIELD2 ... FROM SCHEMA.TABLENAME /* AS OF TIMESTAMP TO_TIMESTAMP('2017-06-30 12:50:00', 'YYYY-MM-DD HH24:MI:SS') */ A
WHERE 
...
AND NOT EXISTS
    (
         SELECT 'x' FROM SCHEMA.TABLENAME
                B
         WHERE (
                    SUBSTR(NLS_LOWER(B.DATAAREAID),1,4) = SUBSTR(NLS_LOWER(A.DATAAREAID),1,4)
                     AND B.recid = A.recid
               )
    )
Все.

Как бы в SQL Server штатно такое сделать ? Вроде до сих пор нельзя.