Question

J'ai une demande d'assistance de la part d'un utilisateur de grande valeur pour ajuster les paramètres d'un tableau de bord à l'échelle de l'entreprise afin qu'il puisse gérer une section de son flux de travail actuellement exclue de ces rapports.Étant donné les deux options immédiatement évidentes de

  1. modifier les paramètres du tableau de bord pour TOUS les utilisateurs à l'échelle de l'entreprise ou
  2. répliquer le tableau de bord pour HVU uniquement

...il a été décidé que je devrais créer une instance "dev" où HVU peut voir une variante de son tableau de bord.Pour ce faire, j'ai porté le .rdl famille à une autre ReportServer instance dans une arborescence de répertoires identique et cloné toutes les procédures stockées dans les ensembles de données pertinents de Schema1 à Schema1_dev.

Question: les procédures stockées et le schéma de sécurité existent tous sur le même serveur et la même base de données, il n'y a donc aucun risque d'utilisateurs orphelins.Est-il possible / quelle est la meilleure façon de cloner toutes les autorisations utilisateur actuelles de Schema1 à Schema1_dev à part vérifier via l'interface graphique SSMS ?

Était-ce utile?

La solution

Cela devrait vous donner un début.Cela suppose que vous avez déjà cloné tous les objets pertinents et que toutes vos autorisations sont au niveau de l'objet ou du schéma (si vous disposez d'autorisations au niveau des colonnes, le script devient un peu plus complexe, mais pas trop mal).

DECLARE 
  @oldschema SYSNAME = N'schema1', 
  @newschema SYSNAME = N'schema1_dev';

DECLARE 
  @sql NVARCHAR(MAX) = N'';

SELECT @sql += N'
 ' + p.state_desc + N' ' 
 + p.[permission_name] + N' ON '
 + QUOTENAME(@newschema) + N'.' + QUOTENAME(o.name)
 + N' TO ' + QUOTENAME(dp.name) + N';'
FROM sys.database_permissions AS p
INNER JOIN sys.objects AS o
ON p.major_id = o.[object_id]
INNER JOIN sys.schemas AS s
ON o.[schema_id] = s.[schema_id]
INNER JOIN sys.database_principals AS dp
ON p.grantee_principal_id = dp.principal_id
WHERE p.class_desc = N'OBJECT_OR_COLUMN'
AND s.name = @oldschema;

SELECT @sql += N'
  ' + p.state_desc + N' '
  + p.[permission_name] + N' ON SCHEMA::' 
  + QUOTENAME(@newschema) 
  + N' TO ' + QUOTENAME(dp.name) + N';'
FROM sys.database_permissions AS p
INNER JOIN sys.schemas AS s
ON p.major_id = s.[schema_id]
INNER JOIN sys.database_principals AS dp
ON p.grantee_principal_id = dp.principal_id
WHERE p.class_desc = N'SCHEMA' 
AND s.name = @oldschema;

PRINT @sql;
-- EXEC sys.sp_executesql @sql;

Notez que si vous avez un parcelle d'objets et/ou d'un parcelle des utilisateurs, le PRINT la sortie peut ne pas tout montrer.

Licencié sous: CC-BY-SA avec attribution
Non affilié à dba.stackexchange
scroll top