2010-08-10 3 views
1

L'utilisateur que j'ai doit avoir accès à toutes les tables d'une base de données - SELECT, INSERT, UPDATE, DELETE et EXECUTE (code ASP à blâmer :-P) sauf pour 1 table par exemple users. Lors de l'octroi db_datareader et db_datawriter cela leur donne un accès complet à tout et supprimer la permission DELETE sur le tableau users ne fonctionnera pas.Accorder SELECT, UPDATE, INSERT, DELETE à toutes les tables sauf 1 (ou plus) dans SQL Server 2005

Il existe plus de 60 tables et recherchait un moyen plus rapide que l'utilisation de SSMS pour parcourir toutes les tables et le faire.

Comment ferais-je cela?

Répondre

4

Vous pouvez refuser explicitement les autorisations qui doivent avoir la priorité. La syntaxe est

deny delete on dbo.users to username 
+0

Donc je peux ajouter db_datareader et db_datawriter et puis exclure séparément l'autorisation sur cette spécif table ic, et ça devrait aller? –

+0

Oui. à partir de MSDN 'Le rôle de base de données fixe db_datawriter peut ajouter, supprimer ou modifier des données dans toutes les tables d'utilisateur. Par conséquent, si vous soustrayez les autorisations sur cette table, vous devriez obtenir l'ensemble dont vous avez besoin. –

0

Vous pouvez utiliser un curseur aki et sp_executesql (GRANT ne peut pas prendre une tablename variables)

declare ctable cursor for 
    select Name from sysobjects where type = 'u' 

declare @Name sysname 
declare @ExecSQL nvarchar(512) 

open ctable 
fetch next FROM ctable into @Name 

while (@@FETCH_STATUS = 0) 
    begin 
     if (@Name <> 'MyTableToExclude') 
     BEGIN 
      SET @ExecSQL = 'grant SELECT on ' + @Name + ' to PUBLIC' 
      EXEC sp_executesql @ExecSQL 

... etc

 END 
     fetch next FROM ctable into @Name 
    end 
close ctable 
deallocate ctable 

mineur ... notez que vous ne pouvez pas accorder exec sur les tables;)

Questions connexes