2012-03-29 7 views
0

Ich muss einen Datenbankbenutzer testen, um festzustellen, ob dieser Benutzer berechtigt ist, Tabellen in der Datenbank zu ändern. Ich brauche zwei Benutzer: einen, der die Datenbanktabellenstruktur ändern kann und einen, der die Rollen db_reader und db_writer hat. Ich fand diese Abfrage im Web alle Berechtigungen für den aktuellen Benutzer zeigt:Wie testen Sie auf Benutzerberechtigungen, die Tabellen auf SQL Server ändern können?

SELECT * FROM fn_my_permissions (NULL, 'DATABASE') 

Hier sind die Ergebnisse für einen readonly Benutzer mit Rollen db_datareader und db_datawriter:

entity_name  subentity_name  permission_name 
-----------  --------------  --------------- 
database       CONNECT 
database       SELECT 
database       INSERT 
database       UPDATE 
database       DELETE 

Hier sind die Ergebnisse für sa:

Returns:

entity_name  subentity_name  permission_name 
-----------  --------------  --------------- 
database       CREATE TABLE 
database       CREATE VIEW 
database       CREATE PROCEDURE 
database       CREATE FUNCTION 
database       CREATE RULE 
database       CREATE DEFAULT 
database       BACKUP DATABASE 
database       BACKUP LOG 
database       CREATE DATABASE 
database       CREATE TYPE 
database       CREATE ASSEMBLY 
database       CREATE XML SCHEMA COLLECTION 
database       CREATE SCHEMA 
database       CREATE SYNONYM 
database       CREATE AGGREGATE 
database       CREATE ROLE 
database       CREATE MESSAGE TYPE 
database       CREATE SERVICE 
database       CREATE CONTRACT 
database       CREATE REMOTE SERVICE BINDING 
database       CREATE ROUTE 
database       CREATE QUEUE 
database       CREATE SYMMETRIC KEY 
database       CREATE ASYMMETRIC KEY 
database       CREATE FULLTEXT CATALOG 
database       CREATE CERTIFICATE 
database       CREATE DATABASE DDL EVENT NOTIFICATION 
database       CONNECT 
database       CONNECT REPLICATION 
database       CHECKPOINT 
database       SUBSCRIBE QUERY NOTIFICATIONS 
database       AUTHENTICATE 
database       SHOWPLAN 
database       ALTER ANY USER 
database       ALTER ANY ROLE 
database       ALTER ANY APPLICATION ROLE 
database       ALTER ANY SCHEMA 
database       ALTER ANY ASSEMBLY 
database       ALTER ANY DATASPACE 
database       ALTER ANY MESSAGE TYPE 
database       ALTER ANY CONTRACT 
database       ALTER ANY SERVICE 
database       ALTER ANY REMOTE SERVICE BINDING 
database       ALTER ANY ROUTE 
database       ALTER ANY FULLTEXT CATALOG 
database       ALTER ANY SYMMETRIC KEY 
database       ALTER ANY ASYMMETRIC KEY 
database       ALTER ANY CERTIFICATE 
database       SELECT 
database       INSERT 
database       UPDATE 
database       DELETE 
database       REFERENCES 
database       EXECUTE 
database       ALTER ANY DATABASE DDL TRIGGER 
database       ALTER ANY DATABASE EVENT NOTIFICATION 
database       ALTER ANY DATABASE AUDIT 
database       VIEW DATABASE STATE 
database       VIEW DEFINITION 
database       TAKE OWNERSHIP 
database       ALTER 
database       CONTROL 

Welche Abfrage würde ich verwenden, um festzustellen, dass der Benutzer schreibgeschützt ist und daher nicht weiter vorgehen kann?

+3

Etwas stimmt hier nicht. Ein schreibgeschützter Benutzer sollte keine INSERT-, UPDATE- und DELETE-Berechtigungen haben. –

+0

Ich stimme @RobertHarvey zu. Wenn der Benutzer schreibgeschützt ist, hat er nicht die Rolle db_writer. –

+0

Können Sie die Abfrage auch posten? –

Antwort

2

Per Definition wird ein Mitglied von db_datawriter und db_datareader bedeutet, dass Ihr Benutzer CRUD-Operationen ausführen kann. Fragen Sie wirklich, wie Sie erkennen können, ob Ihr Benutzer ein Mitglied dieser Rollen ist?

Sie können abfragen, ob Benutzer ein Mitglied einer Rolle sind oder nicht:

sp_helprolemember 'db_datawriter' 

Wenn Sie wirklich daran interessiert sind, eine granulare Berechtigungsstufe Abfrage, warum? Es wird immer wahr, wenn der Benutzer ein Mitglied von db_datawriter und db_datareader ist.

+0

+1 für die Abfrage des Rollenstatus. Das ist es, was das OP tun muss, sobald er seine Rollennamen geklärt hat. –

+0

Kann ich testen, dass der Benutzer nur diese beiden Rollen hat und sonst nichts? –

+0

Ja: EXEC sp_helpuser 'Ihr_Benutzername'. Dadurch werden alle Datenbankrollen aufgelistet, zu denen der Benutzer gehört. Beachten Sie, dass wenn Sie dies für 'dbo' (auch bekannt als 'sa') ausführen, db_datareader und db_datawriter nicht aufgelistet sind; Sie sehen db_owner, der viele weitere Berechtigungen besitzt. –

0

Ich denke, der Befehl, den Sie tatsächlich suchen, ist HAS_PERMS_BY_NAME, die "die effektive Berechtigung des aktuellen Benutzers auf einem sicherungsfähigen auswertet." fn_my_permissions "Gibt eine Liste der Berechtigungen zurück, die dem Principal auf einem sicherungsfähigen System tatsächlich gewährt wurden."

Verwandte Themen