Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Rechte verweigern nur für bestimmte Tabellen (https://www.delphipraxis.net/53060-rechte-verweigern-nur-fuer-bestimmte-tabellen.html)

Jelly 9. Sep 2005 11:10

Datenbank: MSSQL • Zugriff über: ADO

Rechte verweigern nur für bestimmte Tabellen
 
Ich habe in einer relativ unübersichtlich gewordenen MSSQL Datenbank knapp 400 Tabellen und Views drin. Was die Zugriffssicherheit momentan betrifft, ist es so dass alle User in der Datenbankrole db_datareader, db_datawriter sowie db_public sind. Somit können sie soweit überall zugreifen.

Jetzt kommt aber ein Modul hinzu, da soll keiner der normalen Angestellten darauf zugreifen dürfen. Jetzt könnte ich hingehen, eine neue Role erstellen, und die Rechte für alle 400 DB Objekte verteilen, und die Benutzer aus db_datareader und db_datawrite entfernen. Das würde klappen, ist aber umständlich.

Geht das auch irgendwie einfacher. Sobald ich ein
SQL-Code:
deny all on Websessions to Angestellte
mache, erhalte ich selbst auch keinen Zugriff mehr auf das Objekt, da ich selbst auch Angestellte-Mitglied bin.

Jelly 9. Sep 2005 12:35

Re: Rechte verweigern nur für bestimmte Tabellen
 
Ich hab mir jetzt so geholfen, wenns auch nicht die feine englische Art ist...
Ich habe eine Role "Buero" erstellt. Da lege ich alle Leute rein, denen ich Normalzugriff auf die Tabellen geben will. Die dürfen eigentlich alles tun, ausser Zugriff auf bestimmte Tabellen erhalten. Diese Tabellen nehme ich namentlich in die Tabelle excludetables auf. Die Tabellennamen die dort drin enthalten sind, für die sollen keine Rechte an die Role buero vergeben werden. Darin selbst steht die Tabelle excludetables und die Stored Procedure, welche die Rechte neu setzt.

SQL-Code:
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[proc_Regrant]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [dbo].[proc_Regrant]
GO

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO


create procedure proc_Regrant as
declare @Tablename varchar(300)
declare @xtype varchar(10)
declare @CMD varchar(300)
declare CR CURSOR for
  select name, xtype from sysobjects where type in ('U','V','P','FN') and not(name like 'dt_%' and xtype='P') and not(name like 'sys%' and xtype='V') and not (name in (select tablename from excludetables)) order by name

open CR
fetch next from CR into @Tablename, @xtype
while @@fetch_status = 0
begin
  /* Beginne hier, die Records zu bearbeiten */
  set @CMD = 'grant all on [' + @Tablename + '] to Buero'
      execute (@CMD)
      print @Tablename + ' (' + rtrim(@xtype) + ')'
  fetch next from CR into @Tablename, @xtype
END
CLOSE CR
DEALLOCATE CR



GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
Naja, die SP macht nichts anderes, als alle sysObjects zu durchlaufen, die vom Typ U(Tabelle), P(Stored Procedure), V(View) oder FN(Funtion) sind, und welches keine System SP sind (dt_%), keine Systemviews (sys%) sind, und welche nicht in der Tabelle excludetables enthalten sind. Für die restlichen, hoffentlich nur noch Benutzerobjekte, werden alle Rechte zugeteilt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz