GRANT DDL в Oracle для конкретного пользователя - PullRequest
0 голосов
/ 08 сентября 2010

Как предоставить привилегии DDL в oracle?

В базе данных у меня есть пользователи SCHEMA_1, SCHEMA_2 и SCHEMA_3

и теперь я хочу, чтобы из schema_1 можно было выполнять DDL только для SCHEMA_2

Возможно ли предоставление на уровне SCHEMA_2 или только для системы?

Ответы [ 2 ]

1 голос
/ 09 сентября 2010

Лучшим способом может быть внедрение DDL schema_2 в процедуры и предоставление выполнения этих процедур для schema_1.Более полное объяснение ваших требований может привести к более полным / лучшим ответам.

1 голос
/ 08 сентября 2010

Oracle не работает таким образом. Вы должны были бы предоставить CREATE ANY [OBJECT_TYPE] этому пользователю и иметь системный триггер, который ограничивает их работу в схемах, которые вы не хотите.

Предупреждение. Используются недокументированные / недокументированные функции DBMS_STANDARD.

CREATE OR REPLACE TRIGGER schema_1_on_schema_2
  before DDL on DATABASE
as
  has_dba_priv number;
  n            number;
  stmt         ora_name_list_t;
BEGIN
  -- exit if user is object owner
  if ora_dict_obj_owner = ora_login_user then
    return
  end if;

  -- exit if user has dba directly
  select count(*)
    into has_dba_priv
    from dba_role_privs 
   where granted_role = 'DBA'
     and grantee = ora_login_user;

  if has_dba_priv <> 0 then
    return;
  end if;

  -- exit if action is an automatic recompile
  stmt := null;
  n := ora_sql_txt(sql_text);
  FOR i IN 1..n LOOP
    stmt := stmt || sql_text(i);
  END LOOP;

  if stmt like 'ALTER % COMPILE REUSE SETTINGS%' then
    return;
  end if;

  -- you should probably organize this into a database table of permitted
  -- schema_x can affect schema_y, but this is a "basic" example
  if     (ora_dict_obj_owner = 'SCHEMA_2')
     and (ora_login_user = 'SCHEMA_1') then 
    null;
  else
    raise_application_error (-20000, 'User ' || ora_login_user || 
         ' is not permitted to execute DDL against ' || ora_dict_obj_owner);
  end if;
end;
...