Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Сравнение СУБД Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 .. 7 8 9 10 11 [12] 13 14 15 16 .. 25   вперед  Ctrl
 Re: Нужна помощь  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34709

Bogdanov Andrey wrote:

> То есть для декларативных ограничений SQL Server таки применяет ту
> концепцию, которую "ораклисты" защищают. А вот для триггерных почему-то нет.

Чего?

> Современные методики предполагают, что способ реализации инкапсулирован
> (собственно, упоминавшийся выше принцип "изолированности слоев" и есть
> инкапсуляция) внутри объекта с тем, чтобы код приложения, использующего
> объект, не зависил от реализации.
> А тут получается, что приложение должно знать о том, как именно
> реализовано ограничение.

Чего ?

Posted via ActualForum NNTP Server 1.4

28 авг 08, 00:07    [6117611]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
Dihotom
Считать можно как угодно. И я уж согласился с тем, что если в СУБД нет возможности делать что-то хорошо (и правильно), то не нужно лишний раз тыкать пальцем в разработчиков "вы не правы"

Справедливости ради весь сыр-бор начался как раз с тыкания в разработчиков на MS SQL, на первой же странице

Dimitry Sibiryakov
Вот тут ты заблуждаешься: ты не в своём уме - ты в мелкомягком уме.


Bogdanov Andrey
И кто вас учил в триггерах делать откат?
...
Управлять транзакцией из тригера в общем-то идеологически неверно.
28 авг 08, 00:27    [6117655]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Bogdanov Andrey
Member

Откуда: Да уже и сам не знаю...
Сообщений: 2203
SergSuper
Dihotom
Считать можно как угодно. И я уж согласился с тем, что если в СУБД нет возможности делать что-то хорошо (и правильно), то не нужно лишний раз тыкать пальцем в разработчиков "вы не правы"

Справедливости ради весь сыр-бор начался как раз с тыкания в разработчиков на MS SQL, на первой же странице

Bogdanov Andrey
И кто вас учил в триггерах делать откат?
...
Управлять транзакцией из тригера в общем-то идеологически неверно.

И где в в моей фразе "тыкание на MSSQL" нашли?
Это уже потом я понял, что MSSQL не обеспечивает инкапсуляции в данном вопросе. На фоне ваших утверждений, что именно так и должно быть.
28 авг 08, 08:50    [6117954]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Bogdanov Andrey
Member

Откуда: Да уже и сам не знаю...
Сообщений: 2203
MasterZiv
Чего?
Уже слов не хватает, чтобы нормальную фразу построить? :)
28 авг 08, 08:52    [6117958]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
Bogdanov Andrey
И где в в моей фразе "тыкание на MSSQL" нашли?


Ну не надо... Автор топика в какой СУБД транзакциями в триггере управлял? Дальше Ваши сторонники какую СУБД в противоположность упоминали?

Bogdanov Andrey
Это уже потом я понял, что MSSQL не обеспечивает инкапсуляции в данном вопросе. На фоне ваших утверждений, что именно так и должно быть.


Да, да. Еще он не обспечивает наследование и полиморфизм, ибо все эти три понятия применимы к ООБД, и уж никак не к чисто реляционным. Так что в чистую термином "инкапсуляции" я бы не стал тут бросаться, тем более с заявлением "не поддерживает".
28 авг 08, 09:13    [6118001]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь  [new]
Bogdanov Andrey
Member

Откуда: Да уже и сам не знаю...
Сообщений: 2203
pkarklin
Да, да. Еще он не обспечивает наследование и полиморфизм, ибо все эти три понятия применимы к ООБД, и уж никак не к чисто реляционным.
То, что инкапсуляция является одним из столпов ООП совсем не означает, что она имеет смысл только в ООП. Инкапсуляция вполне себе и при процедурном программировании живет. Если вы не понимаете ценности инкапсуляции помимо ООП, то поясню, что целями инкапсуляции являются:
e

  • достижение предельной локализации изменений при необходимости таких изменений,
  • прогнозируемость изменений (какие изменения в коде надо сделать для заданного изменения функциональности) и прогнозируемость последствий изменений.


  • pkarklin
    Так что в чистую термином "инкапсуляции" я бы не стал тут бросаться, тем более с заявлением "не поддерживает".
    Я говорил, что "не поддерживает в данном вопросе", касаясь только вопроса реализации логических ограничений при разработке структуры БД.
    28 авг 08, 09:31    [6118054]     Ответить | Цитировать Сообщить модератору
     Re: Нужна помощь  [new]
    SergSuper
    Member

    Откуда: SPb
    Сообщений: 5488
    hvlad

    pkarklin
    hvlad
    Он будет уволен.
    Меня не организационные вопросы интересуют, а технические. Что будет с базой, в каком состоянии останется текущая сессия, транзакция? Что в ней можно\нельзя будет сделать.
    В худшем случае в сессии останется висеть не закоммиченная тр-ция.
    Типичная ошибка программиста, это что-то новое ?

    Т.е. программист должен знать какие могут возникать исключения в триггерах таблиц, которые он модифицирует?
    28 авг 08, 09:31    [6118056]     Ответить | Цитировать Сообщить модератору
     Re: Нужна помощь  [new]
    pkarklin
    Member

    Откуда: Москва (Муром)
    Сообщений: 74930
    Bogdanov Andrey
    То, что инкапсуляция является одним из столпов ООП совсем не означает, что она имеет смысл только в ООП. Инкапсуляция вполне себе и при процедурном программировании живет. Если вы не понимаете ценности инкапсуляции помимо ООП, то поясню, что целями инкапсуляции являются...


    Что русскому хорошо, то немцу смерть:

    Дилемма инкапсуляции и оптимизации запросов

    Оттуда:

    Приложения РСУБД. В этом случае нет простого ответа. Имеются три разных случая.

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

    Простое программирование и хорошая эффективность обработки запросов. Если свободно формулируемые запросы существенно повышают производительность РСУБД, а программирование кода и запросов является относительно простым, можно согласиться с переписыванием приложения при изменении модели.

    Простое программирование и плохая эффективность выполнения запросов. Как это не парадоксально, иногда можно повысить эффективность путем фрагментации запросов. Оптимизаторы запросов не являются совершенными, и иногда может потребоваться помочь оптимизатору вручную. В этом случае вы смешиваете инкапсуляцию и оптимизацию запросов, пишите запросы, обходящие несколько классов, но меньшее число, чем в предыдущем случае.
    28 авг 08, 09:46    [6118130]     Ответить | Цитировать Сообщить модератору
     Re: Нужна помощь  [new]
    hvlad
    Member

    Откуда:
    Сообщений: 11555
    SergSuper
    hvlad
    pkarklin
    Меня не организационные вопросы интересуют, а технические. Что будет с базой, в каком состоянии останется текущая сессия, транзакция? Что в ней можно\нельзя будет сделать.
    В худшем случае в сессии останется висеть не закоммиченная тр-ция.
    Типичная ошибка программиста, это что-то новое ?

    Т.е. программист должен знать какие могут возникать исключения в триггерах таблиц, которые он модифицирует?
    Он должен понимать, что могут возникнуть ошибки в нижележащем коде. И не только в триггерах. Обработчик исключения на самом верху цепочки вызовов обязан быть.
    Это вообще-то элементарно, странно, что приходится об этом говорить
    Впрочем, при нынешнем состоянии дел с обучением программированию, наверное тут нечему удивляться...
    28 авг 08, 10:10    [6118253]     Ответить | Цитировать Сообщить модератору
     Re: Нужна помощь  [new]
    Dihotom
    Member

    Откуда:
    Сообщений: 453
    pkarklin
    Что русскому хорошо, то немцу смерть:

    Дилемма инкапсуляции и оптимизации запросов

    Но это же материалы для запросов :) Я, например, тоже разделяю это мнение. Однако Bogdanov Andrey говорит об инкапсуляции... даже не знаю как это коротко назвать... исполняемой логики. Т.е. объединение некоторого множества операторов в одну единую операцию (которая может в себя вообще не включить SQL-запросы). Клиенты (другие разработчики) при этом используют эту операцию ничего не зная о её содержимом. Разработчик этой операции может, не меняя её интерфейсов, совершеноствовать или менять её реализацию, при этом изменений в прикладном коде не будет.
    P.S.: Не хочу развивать новый спор теперь и об инкапсуляции - просто комментарий к Вашей ссылке :)
    28 авг 08, 10:12    [6118267]     Ответить | Цитировать Сообщить модератору
     Re: Нужна помощь  [new]
    Bogdanov Andrey
    Member

    Откуда: Да уже и сам не знаю...
    Сообщений: 2203
    SergSuper
    Т.е. программист должен знать какие могут возникать исключения в триггерах таблиц, которые он модифицирует?
    Как раз при вашем подходе он должен это знать и запастись обработчиками на разные случаи жизни - один на случай, если возникнет декларативное исключение, другой, на случай, если триггер откат сделает.
    А при нашем он просто должен знать что вызываемый оператор может либо выполниться, либо не выполниться (причем во втором случае - в базе не будет никаких последствий ошибочно завершенного оператора).
    Вообще, любой код должен предполагать возможность ошибки в вызываемой функции.
    28 авг 08, 10:20    [6118305]     Ответить | Цитировать Сообщить модератору
     Re: Нужна помощь  [new]
    MasterZiv
    Member

    Откуда: Питер
    Сообщений: 34709

    Bogdanov Andrey wrote:

    > Чего?
    >
    > Уже слов не хватает, чтобы нормальную фразу построить? :)
    Не, не хватает.

    Posted via ActualForum NNTP Server 1.4

    28 авг 08, 11:36    [6118806]     Ответить | Цитировать Сообщить модератору
     Re: Нужна помощь  [new]
    MasterZiv
    Member

    Откуда: Питер
    Сообщений: 34709

    pkarklin wrote:

    > Да, да. Еще он не обспечивает наследование и полиморфизм, ибо все эти
    > три понятия применимы к ООБД, и уж никак не к чисто реляционным.

    Дело в том, что эти понятия неприменимы в том числе и к ООСУБД.
    Они вообще к БД неприменимы.

    Так что
    > в чистую термином "инкапсуляции" я бы не стал тут бросаться, тем более с
    > заявлением "не поддерживает".
    +1

    Posted via ActualForum NNTP Server 1.4

    28 авг 08, 11:38    [6118816]     Ответить | Цитировать Сообщить модератору
     Re: Нужна помощь  [new]
    SergSuper
    Member

    Откуда: SPb
    Сообщений: 5488
    Господа, я чего-то уже запутался.
    MS SQL 2005 может как откатить транзакцию, так и вызвать исключение.
    FB может только вызвать исключение.

    Дык чего тогда в MS SQL не хватает? (я с 2005-м не работал)

    И давайте не будем спорить насчет искапсуляции - термин расплывчатый, спорить можно бесконечно и только уйдёт в строну.
    28 авг 08, 12:02    [6119023]     Ответить | Цитировать Сообщить модератору
     Re: Нужна помощь  [new]
    Bogdanov Andrey
    Member

    Откуда: Да уже и сам не знаю...
    Сообщений: 2203
    SergSuper
    MS SQL 2005 может как откатить транзакцию, так и вызвать исключение.
    FB может только вызвать исключение.

    Дык чего тогда в MS SQL не хватает? (я с 2005-м не работал)
    Я и с 2000-то работал слишком давно и мало, поэотому не могу сказать чего именно не хватает. Чтобы разобраться ответьте на пару вопросов.
    В MSSQL в случае вызова исключения из триггера оператор, вызвавший выполнение триггера откатывается? Или откатить можно только всю транзакцию целиком, а не конкретный оператор?
    Тот же вопрос относительно исключения вызванного декларативным ограничением.
    28 авг 08, 12:08    [6119080]     Ответить | Цитировать Сообщить модератору
     Re: Нужна помощь  [new]
    Bogdanov Andrey
    Member

    Откуда: Да уже и сам не знаю...
    Сообщений: 2203
    MasterZiv
    Дело в том, что эти понятия неприменимы в том числе и к ООСУБД.
    Они вообще к БД неприменимы.
    Это ваше личное мнение, или можете ссылочкой на авторитетный источник побаловать, в котором написано, что "понятие инкапсюляции неприменимо к бд".
    28 авг 08, 12:10    [6119099]     Ответить | Цитировать Сообщить модератору
     Re: Нужна помощь  [new]
    MasterZiv
    Member

    Откуда: Питер
    Сообщений: 34709

    Bogdanov Andrey wrote:

    > Это ваше личное мнение, или можете ссылочкой на авторитетный источник
    > побаловать, в котором написано, что "понятие инкапсюляции неприменимо к бд".

    Не личное. Читайте книги по OORDBMS.

    Posted via ActualForum NNTP Server 1.4

    28 авг 08, 12:43    [6119345]     Ответить | Цитировать Сообщить модератору
     Re: Нужна помощь  [new]
    hvlad
    Member

    Откуда:
    Сообщений: 11555
    SergSuper
    Господа, я чего-то уже запутался.
    MS SQL 2005 может как откатить транзакцию,
    И это, вообще говоря, плохо ибо нарушает layering.
    Другой вопрос, что до Юкона не было других методов, как тут вроде бы решили.

    SergSuper
    так и вызвать исключение.
    FB может только вызвать исключение.
    А это правильно и хорошо, ибо не нарушает layering.

    SergSuper
    Дык чего тогда в MS SQL не хватает? (я с 2005-м не работал)
    До 2005 - как раз механизма структурированной обработки ошибок.
    В 2005 и выше - чтобы люди начали его понимать и пользоваться.

    SergSuper
    И давайте не будем спорить насчет искапсуляции - термин расплывчатый, спорить можно бесконечно и только уйдёт в строну.
    Изначально говорили об layering, это несколько другое, хотя и в чём-то похожее понятие.
    28 авг 08, 12:52    [6119410]     Ответить | Цитировать Сообщить модератору
     Re: Нужна помощь  [new]
    pkarklin
    Member

    Откуда: Москва (Муром)
    Сообщений: 74930
    Bogdanov Andrey
    В MSSQL в случае вызова исключения из триггера оператор, вызвавший выполнение триггера откатывается?


    Без наличия обработчика ошибок - нет.

    USE tempdb
    GO
    
    CREATE TABLE T1(col1 int)
    GO
    
    CREATE TRIGGER T1_ut ON T1
    FOR UPDATE
    AS
      IF EXISTS(SELECT * FROM inserted WHERE col1 = 0)
        RAISERROR('Упс!!!', 16, 1)
    GO
    
    SET XACT_ABORT ON
    GO
    BEGIN TRANSACTION;  -- 1
        INSERT T1 VALUES(1)      -- 2
        UPDATE T1 SET col1 = 0      -- 3
        INSERT T1 VALUES(2)      -- 4
    COMMIT TRANSACTION; -- 5
    GO
    
    SELECT
      *
    FROM
      T1
    GO
    
    DROP TABLE T1

    Server: Msg 50000, Level 16, State 1, Procedure T1_ut, Line 5
    Упс!!!
    col1
    -----------
    0
    2

    Bogdanov Andrey
    Или откатить можно только всю транзакцию целиком, а не конкретный оператор?


    Если ROLLBACK, то всю. Если нужно откатить только этот оператор и не расчитывать на "внешний обработчик", то или обратное действие в AFTER триггере или BEFORE триггер.
    28 авг 08, 13:09    [6119534]     Ответить | Цитировать Сообщить модератору
     Re: Нужна помощь  [new]
    Bogdanov Andrey
    Member

    Откуда: Да уже и сам не знаю...
    Сообщений: 2203
    pkarklin
    Если ROLLBACK, то всю. Если нужно откатить только этот оператор и не расчитывать на "внешний обработчик", то или обратное действие в AFTER триггере или BEFORE триггер.
    Ну вот и ответ на вопрос SergSuper - в MSSQL нет возможности отката одного оператора, вызвавшего срабатывание триггера из этого триггера.
    28 авг 08, 14:07    [6120061]     Ответить | Цитировать Сообщить модератору
     Re: Нужна помощь  [new]
    pkarklin
    Member

    Откуда: Москва (Муром)
    Сообщений: 74930
    Bogdanov Andrey
    Ну вот и ответ на вопрос SergSuper - в MSSQL нет возможности отката одного оператора, вызвавшего срабатывание триггера из этого триггера.


    Вопрос. В Oracle при генерации исключения в триггере, оператор, вызвавщий срабатывание триггера, будет откачен автоматически сервером?
    28 авг 08, 14:23    [6120198]     Ответить | Цитировать Сообщить модератору
     Re: Нужна помощь  [new]
    Bogdanov Andrey
    Member

    Откуда: Да уже и сам не знаю...
    Сообщений: 2203
    pkarklin
    Вопрос. В Oracle при генерации исключения в триггере, оператор, вызвавщий срабатывание триггера, будет откачен автоматически сервером?
    Да. Собственно это я имел ввиду, когда несколько страниц назад писал об атомарности операторов.
    28 авг 08, 14:31    [6120279]     Ответить | Цитировать Сообщить модератору
     Re: Нужна помощь  [new]
    pkarklin
    Member

    Откуда: Москва (Муром)
    Сообщений: 74930
    Bogdanov Andrey
    Вопрос. В Oracle при генерации исключения в триггере, оператор, вызвавщий срабатывание триггера, будет откачен автоматически сервером?
    Да. Собственно это я имел ввиду, когда несколько страниц назад писал об атомарности операторов.[/quot]

    А код где?
    28 авг 08, 15:04    [6120557]     Ответить | Цитировать Сообщить модератору
     Re: Нужна помощь  [new]
    Dihotom
    Member

    Откуда:
    Сообщений: 453
    pkarklin
    А код где?


    CREATE TABLE tbl (f INTEGER);
    
    Table created.
    
    CREATE OR REPLACE TRIGGER trg_tbl
        BEFORE INSERT ON tbl
        FOR EACH ROW
        WHEN (new.f < 0)
    BEGIN
        RAISE_APPLICATION_ERROR(-20001, 'Attempt to insert negative value');
    END;
    /
    
    Trigger created.
    
    BEGIN
        INSERT INTO tbl VALUES (1);
        INSERT INTO tbl VALUES (-1); -- оператор, вызывающий срабатывание триггера
        INSERT INTO tbl VALUES (2);
        COMMIT;
    EXCEPTION
        WHEN OTHERS THEN NULL;
    END;
    /
    
    PL/SQL procedure successfully completed.
    
    SELECT *
      FROM tbl;
    
             F
    ----------
             1
    
    ROLLBACK;
    
    Rollback complete.
    
    SELECT *
      FROM tbl;
    
    no rows selected
    
    28 авг 08, 15:17    [6120665]     Ответить | Цитировать Сообщить модератору
     Re: Нужна помощь  [new]
    Bogdanov Andrey
    Member

    Откуда: Да уже и сам не знаю...
    Сообщений: 2203
    pkarklin
    А код где?


    Такой?

    SQL>create table tab(c number);
    
    Таблица создана.
    
    SQL>create trigger trig after insert on tab
      2  for each row
      3  begin
      4    if :new.c<0 then
      5     raise_application_error(-20000,'Error!!!');
      6    end if;
      7  end;
      8  /
    
    Триггер создан.
    
    SQL>insert into tab values(1);
    
    1 строка создана.
    
    SQL>insert into tab values(-1);
    insert into tab values(-1)
                *
    ошибка в строке 1:
    ORA-20000: Error!!!
    ORA-06512: at "USR.TRIG", line 3
    ORA-04088: error during execution of trigger 'USR.TRIG'
    
    
    SQL>select * from tab;
    
             C
    ----------
             1

    Ну или то же самое для statment-level триггера:
    SQL>create table tab(c number);
    
    Таблица создана.
    
    SQL>create trigger trig after insert on tab  declare
      2      nCount integer;
      3    begin
      4      select count(*) into nCount from tab;
      5     if nCount >1 then
      6     raise_application_error(-20000,'Error!!!');
      7    end if;
      8  end;
      9  /
    
    Триггер создан.
    
    SQL>insert into tab values(1);
    
    1 строка создана.
    
    SQL>insert into tab values(-1);
    insert into tab values(-1)
                *
    ошибка в строке 1:
    ORA-20000: Error!!!
    ORA-06512: at "USR.TRIG", line 6
    ORA-04088: error during execution of trigger 'USR.TRIG'
    
    
    SQL>select * from tab;
    
             C
    ----------
             1
    28 авг 08, 15:24    [6120705]     Ответить | Цитировать Сообщить модератору
    Топик располагается на нескольких страницах: Ctrl  назад   1 .. 7 8 9 10 11 [12] 13 14 15 16 .. 25   вперед  Ctrl
    Все форумы / Сравнение СУБД Ответить