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.