![]() |
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:
mache, erhalte ich selbst auch keinen Zugriff mehr auf das Objekt, da ich selbst auch Angestellte-Mitglied bin.
deny all on Websessions to Angestellte
|
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:
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.
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 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:34 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz