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

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

2 вариант: Если первый вариант не подходит и всегда клиент коннектиться как владелец схемы, то он всегда имеет доступ к своим обьектам. В этом случае трудно что-либо сделать. Если делать что-то в триггере - это не производительно. Да и триггер можно просто убить. Тогда доступ к базе делать не напрямую а через приложение.
...
Рейтинг: 0 / 0
Insert
    #32079457
Фотография Denis Popov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Insert
    #32079467
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
to Denis Popov:
Если клиенты будут коннектиться как владельцы этой схемы, почему бы не сделать им drop trigger.... и делать всё что угодно?

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

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

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


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