Передача информации из представлений в базовые таблицы в Oracle (SQL) - PullRequest
2 голосов
/ 28 января 2012

У меня небольшая проблема!

У меня есть оригинальная базовая таблица "StaffAddressDetails" :

CREATE TABLE StaffAddressDetails
(ContactID INTEGER NOT NULL,
Postcode VARCHAR (10) NOT NULL,
HouseNameOrNumber VARCHAR (50) NOT NULL,
Street VARCHAR (50) NOT NULL,
Street2 VARCHAR (50) DEFAULT '...',
Town VARCHAR (50) NOT NULL,
County VARCHAR (50) NOT NULL,
Country VARCHAR (50) NOT NULL,
StaffID INTEGER NOT NULL,
CONSTRAINT StaffAddressDetails_PK PRIMARY KEY (ContactID, Postcode),
CONSTRAINT StaADContactIDSCD FOREIGN KEY (ContactID)
REFERENCES StaffContactDetails (ContactID));

Я хочу, чтобы сотрудники могливидеть только свои собственные данные, поэтому я создал представление "HDPBHTTSKStaffAddDetsForSelf" и предоставил это представление роли "Учитель" :

CREATE VIEW HDPBHTTSKStaffAddDetsForSelf AS
SELECT * FROM StaffAddressDetails
WHERE StaffID IN
 (SELECT USER
 FROM DUAL);

...and ...

GRANT SELECT, INSERT, UPDATE ON HDPBHTTSKStaffAddDetsForSelf TO Teacher;

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

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

Есть ли быстрое исправление ??

Большое спасибо заранее, Зулу

Ответы [ 2 ]

1 голос
/ 29 января 2012

Вы должны использовать WITH CHECK OPTION при создании своего представления, чтобы члены роли Учителя не могли insert или update данные с StaffID данными, отличными от их собственных, то есть

create view ... as select ... from ... where ... WITH CHECK OPTION;

Далее,согласившись с @danihp, единственная причина, по которой я вижу, почему данные, по-видимому, не передаются в таблицу, которую администратор должен видеть, заключается в том, что вставка транзакции не выполняется.

0 голосов
/ 29 января 2012

Согласно моей книге "Администрирование Pro Oracle Database 11g":

Если вы не хотите, чтобы пользователь мог выполнять операции INSERT, UPDATE или DELETE в представлении, тогдане предоставляйте этим объектным привилегиям базовые таблицы для этого пользователя.

Конечно, вы хотите разрешить операций DML для базовой таблицы.Для меня это говорит о том, что вам также нужно убедиться, что у «Учителя» есть соответствующие разрешения и для таблицы StaffAddressDetails.

GRANT SELECT, INSERT, UPDATE ON StaffAddressDetails TO Teacher;

И чтобы повторить ответ Карла, неплохо было бы создать этот типпросмотра с опцией WITH CHECK.

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