Страница 1 из 1

Обновляемый просмотр

Добавлено: 20 сен 2006, 07:56
Lars
Есть базовая таблица, из которой необходимо запретить удаление.
Создан просмотр:

Код: Выделить всё

/******************************************************************************/
CREATE TABLE TBL_PRODUCT_REF (
    ID          DMN_PK NOT NULL /* DMN_PK = BIGINT NOT NULL */,
    NAME        DMN_NAME /* DMN_NAME = VARCHAR(80) DEFAULT ,
    STAND_TIME  DMN_INT /* DMN_INT = INTEGER DEFAULT 0 */,
    IS_DELETE   DMN_BOOLEAN /* DMN_BOOLEAN = SMALLINT DEFAULT 0 NOT NULL CHECK (VALUE IN (0, 1)) */
);




CREATE VIEW VW_TBL_PRODUCT_REF(
    ID,
    NAME,
    STAND_TIME)
AS
select
    ID,
    NAME,
    STAND_TIME
from
TBL_PRODUCT_REF
WHERE IS_DELETE=0;

ALTER TRIGGER VW_TBL_PRODUCT_REF_BD
AS
BEGIN
  UPDATE TBL_PRODUCT_REF SET IS_DELETE = 1
  WHERE (ID = OLD.ID);
END


ALTER TRIGGER VW_TBL_PRODUCT_REF_BI
AS
BEGIN
  INSERT INTO TBL_PRODUCT_REF (
    ID,
    NAME,
    STAND_TIME)
  VALUES (
    NEW.ID,
    NEW.NAME,
    NEW.STAND_TIME);
END

ALTER TRIGGER VW_TBL_PRODUCT_REF_BU
AS
BEGIN
  UPDATE TBL_PRODUCT_REF
  SET ID = NEW.ID,
      NAME = NEW.NAME,
      STAND_TIME = NEW.STAND_TIME
  WHERE (ID = OLD.ID);
END
Удаление производится из родной таблицы. Почему?

Добавлено: 20 сен 2006, 08:14
Ivan_Pisarevsky
А не проще отобрать у юзера права на удаление?

Добавлено: 20 сен 2006, 08:21
Lars
Ivan_Pisarevsky писал(а):А не проще отобрать у юзера права на удаление?
А потом в программе отлавливать exception!

Добавлено: 20 сен 2006, 08:37
Lars
Как сделать VIEW изначально READ ONLY? Иначе он изменяемый по умолчанию для ОДНОЙ таблицы.

Добавлено: 20 сен 2006, 08:51
Lars
Решение задачи не совсем обычное :evil:
Добавлена уникальность по NAME, и в спецификации VIEW указано DISTINCT, по рекомендации Х.Борри, чтобы создать ТОЛЬКО ДЛЯ ЧТЕНИЯ запрос.
триггер стал делать свое дело.

Добавлено: 20 сен 2006, 08:51
dimitr
обычно люди джойнят с rdb$database

Добавлено: 20 сен 2006, 09:01
Lars
Можно пример?
В чем принципиальное отличие моего подхода с DISTINCT.

Добавлено: 20 сен 2006, 09:46
dimitr
Lars писал(а):Можно пример?
В чем принципиальное отличие моего подхода с DISTINCT.

Код: Выделить всё

CREATE VIEW VW_TBL_PRODUCT_REF ( ID, NAME, STAND_TIME )
AS
select ID, NAME, STAND_TIME
from TBL_PRODUCT_REF join RDB$DATABASE ON 1 = 1
WHERE IS_DELETE = 0;
принципиальных отличий нет, окромя быстродействия - твой DISTINCT приведет к абсолютно ненужному SORT-плану. JOIN с одной записью тут выигрышнее.

Добавлено: 20 сен 2006, 13:40
Lars
dimitr писал(а):
Lars писал(а):Можно пример?
В чем принципиальное отличие моего подхода с DISTINCT.

Код: Выделить всё

CREATE VIEW VW_TBL_PRODUCT_REF ( ID, NAME, STAND_TIME )
AS
select ID, NAME, STAND_TIME
from TBL_PRODUCT_REF join RDB$DATABASE ON 1 = 1
WHERE IS_DELETE = 0;
принципиальных отличий нет, окромя быстродействия - твой DISTINCT приведет к абсолютно ненужному SORT-плану. JOIN с одной записью тут выигрышнее.
Спасибо, помогло.