sobre - listar grants de usuario oracle
Seleccionar Grant en todas las tablas que posee un usuario especĂfico (4)
Necesito otorgar permiso de selección para todas las tablas propiedad de un usuario específico a otro usuario. ¿Puedo hacer esto con un solo comando en la línea de:
Grant Select on OwningUser.* to ReceivingUser
O tengo que generar el sql para cada tabla con algo como:
Select ''GRANT SELECT ON OwningUser.''||Table_Name||''TO ReceivingUser''
From All_Tables Where Owner=''OWNINGUSER''
Bueno, no es una declaración única, pero es lo más cercano que se puede obtener con Oracle:
BEGIN
FOR R IN (SELECT owner, table_name FROM all_tables WHERE owner=''TheOwner'') LOOP
EXECUTE IMMEDIATE ''grant select on ''||R.owner||''.''||R.table_name||'' to TheUser'';
END LOOP;
END;
Desde http://psoug.org/reference/roles.html , crea un procedimiento en tu base de datos para que tu usuario lo haga:
CREATE OR REPLACE PROCEDURE GRANT_SELECT(to_user in varchar2) AS
CURSOR ut_cur IS SELECT table_name FROM user_tables;
RetVal NUMBER;
sCursor INT;
sqlstr VARCHAR2(250);
BEGIN
FOR ut_rec IN ut_cur
LOOP
sqlstr := ''GRANT SELECT ON ''|| ut_rec.table_name || '' TO '' || to_user;
sCursor := dbms_sql.open_cursor;
dbms_sql.parse(sCursor,sqlstr, dbms_sql.native);
RetVal := dbms_sql.execute(sCursor);
dbms_sql.close_cursor(sCursor);
END LOOP;
END grant_select;
sí, es posible, ejecuta este comando:
digamos que tienes un usuario llamado thoko
grant select any table, insert any table, delete any table, update any table to thoko;
nota: trabajó en la base de datos oráculo
tablas + vistas + informes de errores
SET SERVEROUT ON
DECLARE
o_type VARCHAR2(60) := '''';
o_name VARCHAR2(60) := '''';
o_owner VARCHAR2(60) := '''';
l_error_message VARCHAR2(500) := '''';
BEGIN
FOR R IN (SELECT owner, object_type, object_name
FROM all_objects
WHERE owner=''SCHEMANAME''
AND object_type IN (''TABLE'',''VIEW'')
ORDER BY 1,2,3) LOOP
BEGIN
o_type := r.object_type;
o_owner := r.owner;
o_name := r.object_name;
DBMS_OUTPUT.PUT_LINE(o_type||'' ''||o_owner||''.''||o_name);
EXECUTE IMMEDIATE ''grant select on ''||o_owner||''.''||o_name||'' to USERNAME'';
EXCEPTION
WHEN OTHERS THEN
l_error_message := sqlerrm;
DBMS_OUTPUT.PUT_LINE(''Error with ''||o_type||'' ''||o_owner||''.''||o_name||'': ''|| l_error_message);
CONTINUE;
END;
END LOOP;
END;
/