Привилегии на уровне столбца и устаревшее приложение - PullRequest
4 голосов
/ 26 января 2010

Я получил запрос на реализацию привилегий на уровне столбца, например:

GRANT UPDATE("column1") ON "TABLE" TO ROLE; 

Но я обнаружил, что клиентские приложения (в Delphi + ODAC) всегда выпускают обновления SQL, такие как:

update TABLE set column1=:column1,column2=:column2,column3=:column3,...etc
where id_c=:id_c;

что заставляет Oracle всегда выдавать ORA-01031: недостаточные привилегии , даже если был изменен только column1. Очевидное решение состоит в том, чтобы изменить клиентское приложение так, чтобы оно генерировало обновления SQL только с измененными столбцами, но это выглядит как довольно много кодирования.

Возможно ли более элегантное решение?

Редактировать: Я забыл упомянуть, что в моих источниках Delphi есть большое количество жестко запрограммированных запросов на вставку / обновление. ODAC не может помочь в этом случае.

Ответы [ 2 ]

3 голосов
/ 26 января 2010

Вы можете создать представление и триггер INSTEAD OF UPDATE для этого представления:

CREATE VIEW myview ON mytable
AS
SELECT  *
FROM    table

CREATE TRIGGER trg_myview_iu
INSTEAD OF UPDATE
ON myview
FOR EACH ROW
BEGIN
        UPDATE  mytable
        SET     column1 = :NEW.column1
        WHERE   id_c = :NEW.id_c;
END;

Если вы хотите обработать столбец, только если его значение не изменилось, вам придется написать несколько UPDATE операторов:

CREATE TRIGGER trg_myview_iu
INSTEAD OF UPDATE
ON myview
FOR EACH ROW
BEGIN
        IF :NEW.column1 <> :OLD.column1 THEN -- add `NULL` processing options if necessary
                UPDATE  mytable
                SET     column1 = :NEW.column1
                WHERE   id_c = :NEW.id_c;
        END IF;
        IF :NEW.column2 <> :OLD.column2 THEN
                UPDATE  mytable
                SET     column2 = :NEW.column2
                WHERE   id_c = :NEW.id_c;
        END IF;
        …
END;

Это далеко не так эффективно.

В Oracle UPDATE выполняется, даже если фактическое значение столбца не изменяется. Это означает, что ряд заблокирован, запускается огонь и т. Д.

1 голос
/ 26 января 2010

Я не знаю о компонентах или библиотеке ODAC, но нельзя ли установить какое-либо свойство, например: update only: changed fields или all fields?

Это кажется пустой тратой времени на включение всех столбцов, даже если они не изменены. Я должен думать, что большинство клиентских библиотек предлагают эту опцию.

Конечно, если вы установили какое-либо свойство SQL компонента sn TQuery-al, вы должны сами создать оператор sql (также на основе только измененных столбцов).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...