Dnes jsem potřeboval přenést část dat z testovací databáze na produkční. Krom pár procedur to byli hlavně uživatelé a role. Poučen z předchozích chyb jsem pořádně prošel celé dialogové okno a vybral vše co jsem chtěl vyexportovat. K mému překvapení se ve výsledném skriptu vyskytovaly pouze příkazy na vytvoření uživatelů a rolí. Ne však už na přidělení patřičných oprávnění.

Je to k nevíře, ale SQL Server Management Studio neumožňuje exportovat do SQL skriptu oprávnění k objektům. Nebo jsem na to alespoň po hodinách bádání nepřišel.

Naštěstí nejsem první, komu tato funkčnost chybí, a tak jsem našel dva skripty, které tento nedostatek částečně řeší. Oba jsou k dispozici zde: How to Script User and Role Object Permissions in SQL Server.
První z nich vytvoří skript s oprávněními pro konkrétního uživatele, druhý (na druhé stránce článku) pro konkrétní roli.

Kvůli nestandardní pomlčce v názvech rolí jsem si jen upravil část

SQL:
SET @msgStatement = 'GRANT' + CHAR(13) +
CHAR(9) + @msgStatement + CHAR(13) +
CHAR(9) + 'ON ' + @ObjectName + CHAR(13) +
CHAR(9) + 'TO ' + @DatabaseRoleName
PRINT @msgStatement

na

SQL:
SET @msgStatement = 'GRANT' + CHAR(13) +
CHAR(9) + @msgStatement + CHAR(13) +
CHAR(9) + 'ON ' + @ObjectName + CHAR(13) +
CHAR(9) + 'TO ' + '"' + @DatabaseRoleName + '"'
PRINT @msgStatement

Tedy přidal uvozovky kolem názvu role, aby bylo možné použít vygenerovaný skript bez dalších úprav. (stejnou úpravu je třeba udělat i v části s odebíráním práv)

Zmínil jsem se, že skripty chybějící export oprávnění řeší jen částečně. Neberou totiž v potaz řadu oprávnění, které je možno nastavit v Management Studiu. Například oprávnění vůči celé databázi či schématu.