Toon posts:

[SQL] Privileges opvragen van een database

Pagina: 1
Acties:
  • 478 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hallo

Ik ben op zoek naar SQL code om op verschillende soorten databases(Oracle, Mysql, MSSQL etc.) de privileges op te vragen van een database voor de huidige user in een connectie.

in Mysql doe ik dit met "SHOW GRANTS FOR CURRENT_USER" alleen gaat dit helaas niet voor andere databases op.

Natuurlijk heb ik al gezocht en in Oracle iets gevonden met tabellen zoals DBA_SYS_PRIVS waar privileges in staan.. Is hier een algemene SQL query voor? Of weet iemand de query voor Oracle / MSSQL ?

It would be great!

  • The Eagle
  • Registratie: Januari 2002
  • Laatst online: 12:52

The Eagle

I wear my sunglasses at night

Lijkt me dat je dit gewoon met Google moet kunnen vinden :) Zoek maar eens op "Oracle manual" oid, of "Oracle grants" :)

Al is het nieuws nog zo slecht, het wordt leuker als je het op zijn Brabants zegt :)


Verwijderd

Topicstarter
Tja natuurlijk al gegoogled, geen post voor google :) Heb wel een query gevonden die system privileges van een user laat zien, maar bij MySQL weet ik dat je globale en specifieke privileges hebt. Aangezien het daar niet zo moeilijk is door deze met SHOW GRANTS FROM user@database op te vragen kan ik daar wel mee overweg.

Gevonden Oracle query:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT LPAD(' ', 2*level) || granted_role "USER PRIVS"
FROM (
  SELECT NULL grantee,  username granted_role
  FROM dba_users
  WHERE username LIKE UPPER('%&uname%')
  UNION
  SELECT grantee, granted_role
  FROM dba_role_privs
  UNION
  SELECT grantee, privilege
  FROM dba_sys_privs)
START WITH grantee IS NULL
CONNECT BY grantee = prior granted_role;

  • jochemd
  • Registratie: November 2000
  • Laatst online: 24-09 23:08
Verwijderd schreef op donderdag 30 november 2006 @ 10:25:

Ik ben op zoek naar SQL code om op verschillende soorten databases(Oracle, Mysql, MSSQL etc.) de privileges op te vragen van een database voor de huidige user in een connectie.
(..)
Is hier een algemene SQL query voor?
SQL:
1
2
3
4
5
6
SELECT * FROM INFORMATION_SCHEMA.COLUMN_PRIVILEGES
SELECT * FROM INFORMATION_SCHEMA.ROUTINE_PRIVILEGES
SELECT * FROM INFORMATION_SCHEMA.TABLE_PRIVILEGES
SELECT * FROM INFORMATION_SCHEMA.USAGE_PRIVILEGES
SELECT * FROM INFORMATION_SCHEMA.DATA_TYPE_PRIVILEGES
SELECT * FROM INFORMATION_SCHEMA.ENABLED_ROLES

En dan ben ik er vast nog wel een paar vergeten.

Verwijderd

Topicstarter
jochemd schreef op donderdag 30 november 2006 @ 15:07:
[...]

SQL:
1
2
3
4
5
6
SELECT * FROM INFORMATION_SCHEMA.COLUMN_PRIVILEGES
SELECT * FROM INFORMATION_SCHEMA.ROUTINE_PRIVILEGES
SELECT * FROM INFORMATION_SCHEMA.TABLE_PRIVILEGES
SELECT * FROM INFORMATION_SCHEMA.USAGE_PRIVILEGES
SELECT * FROM INFORMATION_SCHEMA.DATA_TYPE_PRIVILEGES
SELECT * FROM INFORMATION_SCHEMA.ENABLED_ROLES

En dan ben ik er vast nog wel een paar vergeten.
Thx voor je reactie, alleen is dit wel mysql specifiek, dus voor Oracle nog eventjes verder zoeken.

  • jochemd
  • Registratie: November 2000
  • Laatst online: 24-09 23:08
Verwijderd schreef op maandag 04 december 2006 @ 10:46:

Thx voor je reactie, alleen is dit wel mysql specifiek
Dat is het niet. Probeer het maar eens in wat andere database (PostgreSQL, MS SQL Server, Mimer SQL etc.).

Je vroeg "Is hier een algemene SQL query voor?" dus heb ik je een aantal SQL queries gegeven die gebruik maken van functionaliteit zoals de SQL standaard (ISO/IEC 9075:2003, deel 11, Information and Definition Schemas) die definieert. In iedere database die zich aan de SQL standaard houdt werkt dit. Als jij een databases gebruikt die zich niet aan de SQL standaard houdt dan moet je niet om een algemene SQL query vragen.

Verwijderd

Topicstarter
Nee klopt, je hebt gelijk. Alleen is information_schema nog niet zo lang geintegreerd in Oracle geloof ik, en dan moet je het ook nog specifiek aanzetten. Ik had verwacht dat Oracle zich wel aan die standaard zou houden dus daarom vroeg ik om een een algemene query. Heb hier al wel wat sys tables gevonden: http://www.techonthenet.com/oracle/sys_tables/index.php. Alleen heb ik nog niet de juiste tabel gevonden waarin ik terug vind of een gebruiker privileges heeft voor select, insert en update. session_privs geeft het volgende:
PRIVILEGE
CREATE SESSION
UNLIMITED TABLESPACE
CREATE TABLE
CREATE CLUSTER
CREATE SYNONYM
CREATE PUBLIC SYNONYM
CREATE VIEW
CREATE SEQUENCE
CREATE DATABASE LINK
CREATE ROLE
CREATE PROCEDURE
CREATE TRIGGER
CREATE MATERIALIZED VIEW
CREATE TYPE
CREATE OPERATOR
CREATE INDEXTYPE

Verwijderd

Topicstarter
Nieuw (gerelateerd) vraagje, weet niet zeker of ik er een nieuw topic voor moet openen.
Hoe kan ik opvragen of 'user'@'%' bestaat in een mysql db dmv een query?

Reden hiervoor is omdat er een user @ localhost is met bepaalde rechten, maar blijkbaar gaat user @ % voor, waar alle privileges granted zijn. Dús wil ik eerst eventjes controleren of die user@% bestaat.

Verwijderd

Topicstarter
En het antwoord gevonden (voor de mensen die het ook ooit eens nodig hebben):

SELECT * FROM INFORMATION_SCHEMA.USER_PRIVILEGES WHERE GRANTEE LIKE \"'username'@'\%'\"

  • JaQ
  • Registratie: Juni 2001
  • Laatst online: 16:39

JaQ

Zoiets als dit bedoel je?

SQL:
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
set pause on 
set pause Continues... 
set verify off 
set pages 20 
set lines 132 
 
select 'Column' lvl,c.privilege,c.grantable,c.owner,c.table_name,c.column_name 
from dba_col_privs c 
where grantee = upper('&&grantee') 
union 
select 'Role' GrType,r.granted_role obj,r.admin_option a, null,null,null 
from dba_role_privs r 
where r.grantee = upper('&grantee') 
union 
select 'Sys Priv',s.privilege,s.admin_option,null,null,null 
from dba_sys_privs s 
where s.grantee = upper('&grantee') 
union 
select 'table',t.privilege,t.grantable,t.owner,t.table_name,null 
from dba_tab_privs t 
where t.grantee = upper('&grantee') 
and t.privilege !='EXECUTE' 
union 
select 'Program', e.privilege,e.grantable,e.owner,e.table_name,null 
from dba_tab_privs e 
where e.grantee = upper('&grantee') 
and e.privilege ='EXECUTE' 
order by 1,2,4,5,6 
/ 
undefine grantee 


opslaan als sql script en aanroepen met:

SQL:
1
sql> @script gebruikersnaam


Dit soort scripts zijn prima te vinden via otn.oracle.com of op metalink.oracle.com

Egoist: A person of low taste, more interested in themselves than in me


  • JaQ
  • Registratie: Juni 2001
  • Laatst online: 16:39

JaQ

Verwijderd schreef op maandag 11 december 2006 @ 14:25:
En het antwoord gevonden (voor de mensen die het ook ooit eens nodig hebben):

SELECT * FROM INFORMATION_SCHEMA.USER_PRIVILEGES WHERE GRANTEE LIKE \"'username'@'\%'\"
Mits je versie van Oracle > 10.1 is ;)

Egoist: A person of low taste, more interested in themselves than in me


Verwijderd

Topicstarter
ja idd, vergat erbij te melden dat het voor mysql was in dit geval (en oracle >10.1). Werk op dit moment met verschillende databases tegelijk dusja, een beetje verwarrend af en toe;)
Pagina: 1