Discussion:
Berechtigungen herausfinden
(zu alt für eine Antwort)
Ernst Greiner
2006-04-10 13:37:51 UTC
Permalink
Hallo,

(SQL Server 2005, WinForms Applikation, VS 2005)

Ich möchte gerne die Berechtigungen auf tables, views... (select,
update, delete, insert) des angemeldeten users abfragen, um im vorhinein
nur bestimmte Menüeinträge, Aktionen... zuzulassen.

Ich bin bis jetzt über die security catalog views
sys.database_permissions usw. in der OH drüber gefallen.

Von der Verwendung der Funktion PERMISSIONS() wird weil veraltet und
demnächst nicht mehr verfügbar, abgeraten und zur Verwendung des catalog
views sys.fn_my_permissions geraten, der anscheinend aber nur in der OH
dokumentiert, aber (noch) nicht umgesetzt ist.

Ich suche sowas wie CanSelect('TableXY'),
CanInsert('View123', CurrentUser)...
Sowas in der Art.

Bei den sys.database_permissions hat man afaik nur Zugriff auf die
Berechtigungen die auf Userebene gesetzt wurden, nicht aber Rechte die
der user zb. durch Rollen erhält.

Der Datenzugriff läuft bei mir über NHibernate (ORM), dass kann das
angeblich auch nicht herausfinden (lt. Auskunft über deren NG).

Mich wunderts, dass ich zu diesem Thema nicht wirklich was finde, dass
Bedürfnis gibts doch sicher schon länger.

Könnt ihr mir ein paar Tips, Stichwörter zu diesem Thema nennen?

tia Ernst
Jens
2006-04-10 13:53:14 UTC
Permalink
Hi Ernst,

Sieh Dir doch mal die Prozedur: sp_helprotect an.

HTH, Jens Suessmeyer.

----
http://www.sqlserver2005.de
----
Ernst Greiner
2006-04-10 16:14:18 UTC
Permalink
Post by Jens
Hi Ernst,
Sieh Dir doch mal die Prozedur: sp_helprotect an.
Danke, ist aber wieder nur ein Teil vom Kuchen.
Anscheinend gehts nicht anders als das man sämtliche Einzelinfos
Userberechtigungen, in welchen Rollen ist er Mitglied usw. zusammenfängt
und dann auswertet.

lg Ernst
Elmar Boye
2006-04-10 20:29:40 UTC
Permalink
Hallo Ernst,
Post by Ernst Greiner
(SQL Server 2005, WinForms Applikation, VS 2005)
Ich möchte gerne die Berechtigungen auf tables, views... (select,
update, delete, insert) des angemeldeten users abfragen, um im
vorhinein nur bestimmte Menüeinträge, Aktionen... zuzulassen.
Ich bin bis jetzt über die security catalog views
sys.database_permissions usw. in der OH drüber gefallen.
Dir sollte klar sein, das schon grundsätzlich gefiltert wird,
ein Benutzer sieht auch über sys.objects, sys.tables usw.
nur die Objekte auf die er irgendeine Berechtigung hat.
Post by Ernst Greiner
Von der Verwendung der Funktion PERMISSIONS() wird weil veraltet und
demnächst nicht mehr verfügbar, abgeraten und zur Verwendung des
Naja, ein-, zwei Versionen wird sie wohl mindestens noch
existieren. Nur ist PERMISSIONS insofern vom Grundkonzept
eingeschränkt, als sie von den neuen Möglichkeiten nichts
weiss.
Post by Ernst Greiner
catalog views sys.fn_my_permissions geraten, der anscheinend aber nur
in der OH dokumentiert, aber (noch) nicht umgesetzt ist.
Doch die gibts.
Praktischer als Ersatz für die PERMiSSIONS FUnktion dürfte
aber has_perms_by_name sein. Die kann man als Skalar-
Funktion als Ausgabe wie als Filter nutzen, siehe die
Beispiele in der Online Hilfe dazu.
Post by Ernst Greiner
Ich suche sowas wie CanSelect('TableXY'),
CanInsert('View123', CurrentUser)...
Sowas in der Art.
wäre in etwa:
SELECT has_perms_by_name('dbo.TableXY', 'OBJECT', 'SELECT') AS CanSelect,
has_perms_by_name('dbo.TableXY', 'OBJECT', 'INSERT') AS CanInsert

Gruss
Elmar
Ernst Greiner
2006-04-11 08:04:22 UTC
Permalink
Hallo Elmar,
Post by Elmar Boye
Post by Ernst Greiner
catalog views sys.fn_my_permissions geraten, der anscheinend aber nur
in der OH dokumentiert, aber (noch) nicht umgesetzt ist.
Doch die gibts.
ich find da nix in der OH
wo ist das?
Post by Elmar Boye
Post by Ernst Greiner
Ich suche sowas wie CanSelect('TableXY'),
CanInsert('View123', CurrentUser)...
Sowas in der Art.
SELECT has_perms_by_name('dbo.TableXY', 'OBJECT', 'SELECT') AS CanSelect,
has_perms_by_name('dbo.TableXY', 'OBJECT', 'INSERT') AS CanInsert
ja super, dass dürfts sein.

Danke Elmar

lg Ernst
Elmar Boye
2006-04-11 08:39:38 UTC
Permalink
Hallo Ernst,
Post by Ernst Greiner
Post by Elmar Boye
Post by Ernst Greiner
catalog views sys.fn_my_permissions geraten, der anscheinend aber
nur in der OH dokumentiert, aber (noch) nicht umgesetzt ist.
Doch die gibts.
ich find da nix in der OH
siehe: http://msdn2.microsoft.com/de-de/library/ms176097.aspx
Post by Ernst Greiner
wo ist das?
Damit die bescheidene OH Suchfunktion es findet nur
fn_my_permissions (kein sys. usw.) eingeben.

Gruss
Elmar
Ernst Greiner
2006-04-11 15:33:31 UTC
Permalink
Post by Elmar Boye
Hallo Ernst,
Post by Ernst Greiner
Post by Elmar Boye
Post by Ernst Greiner
catalog views sys.fn_my_permissions geraten, der anscheinend aber
nur in der OH dokumentiert, aber (noch) nicht umgesetzt ist.
Doch die gibts.
ich find da nix in der OH
siehe: http://msdn2.microsoft.com/de-de/library/ms176097.aspx
Post by Ernst Greiner
wo ist das?
Damit die bescheidene OH Suchfunktion es findet nur
fn_my_permissions (kein sys. usw.) eingeben.
Hallo Elmar,

OK ich hatte da nur unter dem index nicht aber unter search gesucht...

fn_my_permissions das macht schon so ziemlich das was ich will,
schön wäre noch wenn ich mir alle permissions für alle zb. tables
auf einen rutsch holen könnte. Vermutlich geht das nur mit stored
procedures, da bin ich aber noch nicht so fit...

wie kann ich in einer sp die sys.tables durchlaufen und mir dann über
fn_my_permissions alle rechte zusammensammeln, könntest du mir da bitte
noch einmal unter die arme greifen.

lg Ernst
Ernst Greiner
2006-04-12 08:23:23 UTC
Permalink
Post by Ernst Greiner
wie kann ich in einer sp die sys.tables durchlaufen und mir dann über
fn_my_permissions alle rechte zusammensammeln, könntest du mir da bitte
noch einmal unter die arme greifen.
lg Ernst
Bis jetzt hab ich folgendes erreicht:
-----------------------------------------
CREATE PROCEDURE dbo.myspTablePermissions
AS

DECLARE @tabname nvarchar(100)

DECLARE c CURSOR LOCAL FORWARD_ONLY
FOR SELECT name from sys.tables FOR READ ONLY

OPEN c
FETCH NEXT FROM c INTO @tabname

WHILE (@@FETCH_STATUS=0)
BEGIN

Select * from fn_my_permissions(@tabname, 'object')
where subentity_name='';

FETCH NEXT FROM c INTO @tabname
END

CLOSE c
DEALLOCATE c
-----------------------------------------


allerdings gibt mir das soviele teilmengen wie sys.tables vorhanden sind
zurück.
gibts da eine elegantere möglichkeit oder bleibt nur ein insert in eine
temporäre tabelle um eine gesamtauflistung zu erhalten?

lg Ernst
Elmar Boye
2006-04-12 08:27:46 UTC
Permalink
Hallo Ernst,
Post by Ernst Greiner
Post by Elmar Boye
Post by Ernst Greiner
Post by Elmar Boye
Post by Ernst Greiner
catalog views sys.fn_my_permissions geraten, der anscheinend aber
nur in der OH dokumentiert, aber (noch) nicht umgesetzt ist.
Doch die gibts.
ich find da nix in der OH
siehe: http://msdn2.microsoft.com/de-de/library/ms176097.aspx
Post by Ernst Greiner
wo ist das?
Damit die bescheidene OH Suchfunktion es findet nur
fn_my_permissions (kein sys. usw.) eingeben.
OK ich hatte da nur unter dem index nicht aber unter search gesucht...
Da ist sie (wie auch anderes) leider nicht zu finden.
Post by Ernst Greiner
fn_my_permissions das macht schon so ziemlich das was ich will,
Die Tabellenfunktion bastelt selbst nur mit has_perms_by_name
etwas zusammen...
Post by Ernst Greiner
schön wäre noch wenn ich mir alle permissions für alle zb. tables
auf einen rutsch holen könnte.
Da dabei hier der Objektname als Eingabe verwendet werden müsste
ist die Funktion dafür nur umständlich zu nutzen.


Mal zwei Alternativen einmal mit den "gewünschten" Berechtigungen
auf Spaltenebene und einmal vergleichbar mit fn_my_permission
untereinander. Ich habe es für das Beispiel auf Tabellen und
Sichten begrenzt, ggf. kannst Du auch Prozeduren usw. hinzunehmen.

-- Ausgabe ausgewählter Berechtigungen für Tabellen und Sichten
SELECT
ObjectName,
has_perms_by_name(ObjectName, 'OBJECT', 'ANY') AS AnyPermission,
has_perms_by_name(ObjectName, 'OBJECT', 'SELECT') AS SelectPermission,
has_perms_by_name(ObjectName, 'OBJECT', 'INSERT') AS InsertPermission,
has_perms_by_name(ObjectName, 'OBJECT', 'UPDATE') AS UpdatePermission,
has_perms_by_name(ObjectName, 'OBJECT', 'DELETE') AS DeletePermission
FROM (SELECT
QUOTENAME(SCHEMA_NAME(schema_id)) + '.'
+ QUOTENAME(OBJECT_NAME(object_id)) AS ObjectName
FROM sys.objects
-- nur Tabellen und Sichten
WHERE TYPE IN ('U', 'V')) AS o
ORDER BY ObjectName

-- Ausgabe effektiver Berechtigungen über fn_builtin_permissions
SELECT
ObjectName,
p.permission_name AS Permission
FROM (SELECT
QUOTENAME(SCHEMA_NAME(schema_id)) + '.'
+ QUOTENAME(OBJECT_NAME(object_id)) AS ObjectName
FROM sys.objects
-- nur Tabellen und Sichten
WHERE TYPE IN ('U', 'V')) AS o
INNER JOIN sys.fn_builtin_permissions('OBJECT') AS p
ON has_perms_by_name(ObjectName, 'OBJECT', permission_name) <> 0
ORDER BY ObjectName, Permission

Gruss
Elmar
Ernst Greiner
2006-04-12 14:54:39 UTC
Permalink
Hallo Elmar,
Post by Elmar Boye
Mal zwei Alternativen einmal mit den "gewünschten" Berechtigungen
auf Spaltenebene und einmal vergleichbar mit fn_my_permission
untereinander. Ich habe es für das Beispiel auf Tabellen und
Sichten begrenzt, ggf. kannst Du auch Prozeduren usw. hinzunehmen.
-- Ausgabe ausgewählter Berechtigungen für Tabellen und Sichten
SELECT
ObjectName,
has_perms_by_name(ObjectName, 'OBJECT', 'ANY') AS AnyPermission,
has_perms_by_name(ObjectName, 'OBJECT', 'SELECT') AS SelectPermission,
has_perms_by_name(ObjectName, 'OBJECT', 'INSERT') AS InsertPermission,
has_perms_by_name(ObjectName, 'OBJECT', 'UPDATE') AS UpdatePermission,
has_perms_by_name(ObjectName, 'OBJECT', 'DELETE') AS DeletePermission
FROM (SELECT
QUOTENAME(SCHEMA_NAME(schema_id)) + '.'
+ QUOTENAME(OBJECT_NAME(object_id)) AS ObjectName
FROM sys.objects
-- nur Tabellen und Sichten
WHERE TYPE IN ('U', 'V')) AS o
ORDER BY ObjectName
-- Ausgabe effektiver Berechtigungen über fn_builtin_permissions
SELECT
ObjectName,
p.permission_name AS Permission
FROM (SELECT
QUOTENAME(SCHEMA_NAME(schema_id)) + '.'
+ QUOTENAME(OBJECT_NAME(object_id)) AS ObjectName
FROM sys.objects
-- nur Tabellen und Sichten
WHERE TYPE IN ('U', 'V')) AS o
INNER JOIN sys.fn_builtin_permissions('OBJECT') AS p
ON has_perms_by_name(ObjectName, 'OBJECT', permission_name) <> 0
ORDER BY ObjectName, Permission
Funktioniert super, vielen Dank Elmar

lg Ernst

Loading...