Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Insert / 7 сообщений из 7, страница 1 из 1
15.12.2002, 15:27
    #32079428
Andrej
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert
1. Как сделать так, чтобы новую запись
в таблицу можно было вставить только
через специальную процедуру в пакете,
а SQL оператор INSERT ни при каких условиях
не выполняется?

2. Кто-нибудь рекурсивные запросы или процедуры исплользует?
Поиск путей в графе например?
...
Рейтинг: 0 / 0
15.12.2002, 16:04
    #32079451
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert
1 вариант: Таблицу, как и другие обьекты помещаешь в отдельную схему, владелец которой сам никогда не использеутся для подключения клиентами.
В этом случае даёшь от имени этого специальньго юзера, владельца схемы другим юзерам только те гранты которые нужно.

2 вариант: Если первый вариант не подходит и всегда клиент коннектиться как владелец схемы, то он всегда имеет доступ к своим обьектам. В этом случае трудно что-либо сделать. Если делать что-то в триггере - это не производительно. Да и триггер можно просто убить. Тогда доступ к базе делать не напрямую а через приложение.
...
Рейтинг: 0 / 0
15.12.2002, 16:08
    #32079457
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert
1.a
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
sql> create table test (
   2       test_id integer
   3     , constraint pk_test primary key (test_id)
   4   )
   5   /

Table created.

sql> create or replace package pkg_test as
   2     function insertEnable return boolean;
   3     pragma restrict_references (insertEnable, wnds, wnps);
   4     procedure insertTest(p_test_id integer);
   5   end;
   6   /

Package created.

sql> create or replace package body pkg_test as
   2     v_insertEnable boolean := false;
   3   
   4     function insertEnable return boolean as
   5     begin
   6       return v_insertEnable;
   7     end;
   8   
   9     procedure insertTest(p_test_id integer) as
  10     begin
  11       v_insertEnable := true;
  12       insert into test(test_id) values (p_test_id);
  13       v_insertEnable := false;
  14     exception when others then
  15       v_insertEnable := false;
  16       raise;
  17     end;
  18   end;
  19   /

Package body created

sql> 
sql> create or replace trigger tbi_test
   2   before insert on test
   3   begin
   4     if not pkg_test.insertEnable then
   5       raise_application_error(- 20001 , 'Call pkg_test.insertTest for insert into test');
   6     end if;
   7   end;
   8   /

Trigger created

sql> insert into test (test_id) values ( 1 );

insert into test (test_id) values ( 1 )

ORA- 20001 : Call pkg_test.insertTest for insert into test
ORA- 06512 : at  "DAN.TBI_TEST" , line  3 
ORA- 04088 : error during execution of trigger 'DAN.TBI_TEST'

sql> exec pkg_test.insertTest( 1 );

PL/SQL procedure successfully completed



1.b Административно- таблицы лежат в одной схеме, а процедуры в другой.


2. Я использую, не для поиска путей в графе, но использую.
...
Рейтинг: 0 / 0
15.12.2002, 16:15
    #32079467
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert
to Denis Popov:
Если клиенты будут коннектиться как владельцы этой схемы, почему бы не сделать им drop trigger.... и делать всё что угодно?

Если они будут коннектиться как не владельцы - то достаточно того что у них нет grant on insert.
...
Рейтинг: 0 / 0
15.12.2002, 16:41
    #32079484
Denis Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert
1. Имхо лучше сразу от этого уходить при разработке приложения и не допускать, чтобы пользователи не заходили под владельцем боевых таблиц. Но если такое имеется- создай этот триггер от имени другого, привелегированного пользователя, куда уж всяко никто не сунется; SYS'а, к примеру.

2. Да, этого достаточно. Это рецепт по-моему от самих Ораклов: разделять владельца данных и владельца методов доступа к этим данным. Если у тебя есть возможность "развести" этих пользователей, административно запретив всем остальным входить под именем владельца таблиц- тебе повезло.

И проясни задачу: все-таки сторонние пользователи у тебя могут заходить под именем владельца таблиц, или нет?
...
Рейтинг: 0 / 0
16.12.2002, 08:38
    #32079606
Mergen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert
А если оставить пользователю только привелегию create session, то он ,насколько я знаю нечего несможет сделать с объектами.
...
Рейтинг: 0 / 0
16.12.2002, 09:10
    #32079614
ShgGena
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Insert
Еще проще если забрать у владельца схемы право CREATE SESSION
а права передавать через пользователя с ролью DBA,
в 9i это возможно и без передачи прав от владельца к dba.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Insert / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]