{"id":440,"date":"2020-04-25T21:14:26","date_gmt":"2020-04-25T20:14:26","guid":{"rendered":"https:\/\/www.csopro.de\/biblog\/?p=440"},"modified":"2020-08-08T19:20:21","modified_gmt":"2020-08-08T18:20:21","slug":"sql-server-spezifische-rollen-fuer-z-b-etl-verarbeitung","status":"publish","type":"post","link":"https:\/\/www.csopro.de\/biblog\/2020\/04\/sql-server-spezifische-rollen-fuer-z-b-etl-verarbeitung\/","title":{"rendered":"SQL Server: spezifische Rollen f\u00fcr z.B. ETL-Verarbeitung"},"content":{"rendered":"\n<h4 class=\"wp-block-heading\">Motivation<\/h4>\n\n\n\n<p>In diesem Artikel m\u00f6chte ich beschreiben, wie man eigene Datenbank-Rollen anlegt und diesen bestimmte Rechte gibt.<\/p>\n\n\n\n<p>Dies wird zum Beispiel ben\u00f6tigt, wenn man ETLs im SQL Server Agent ausf\u00fchren l\u00e4sst, die nat\u00fcrlich gewisse Rechte auf der Datenbank ben\u00f6tigen. Ich sehe es oft, dass die ausf\u00fchrenden User dann dbo-Rechte bekommen, da man (oder der Integrator) bei der Installation der Jobs nicht wei\u00df, welche Rechte sie genau ben\u00f6tigen. Best practice ist nat\u00fcrlich, dass die ausf\u00fchrenden User m\u00f6glichst wenig Rechte bekommen.<\/p>\n\n\n\n<p>Ich sehe es als Entwickler-Aufgabe an, die Rollen zu erstellen und mit den n\u00f6tigen Rechten auszustatten.<br>Es ist dann die Aufgabe des Integrators, die entsprechenden User anzulegen und der Rolle zuzuordnen.<\/p>\n\n\n\n<p>Den User kennt n\u00e4mlich der Entwickler in der Regel nicht, welche Rechte er aber braucht, wei\u00df der Integrator in der Regel nicht.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Umsetzung<\/h4>\n\n\n\n<p>In meinem Beispiel verwende ich eine Datenbank namens &#8222;Faktura&#8220; und einen User namens &#8222;HOGWARTS\\Tobias&#8220;<\/p>\n\n\n\n<p>Das Anlegen einer Rolle ist ganz einfach &#8211; hier hei\u00dft sie &#8222;<em>db_ETL_Verarbeitung<\/em>&#8222;<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"sql\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">use Faktura\n go\n CREATE ROLE [db_ETL_Verarbeitung]\n GO<\/pre>\n\n\n\n<p>Nun m\u00fcssen wir definieren, welche Rechte die Rolle haben soll.<br>In unserem Beispiel soll sie<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>aus allen Tabellen des Schemas <em>dbo <\/em>lesen k\u00f6nnen (SELECT)<\/li><li>die Tabelle <em>dbo.Spesensaetze<\/em> aktualisieren d\u00fcrfen (UPDATE)<\/li><li>und die Funktion <em>dbo.getDatumDate<\/em> ausf\u00fchren d\u00fcrfen (EXECUTE)<\/li><\/ul>\n\n\n\n<p>Das sind nat\u00fcrlich nur Beispiele, aber wenn man die Syntax kennt, findet man im Internet noch alle m\u00f6glichen Beispiele.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"sql\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\"> GRANT SELECT ON SCHEMA::dbo TO [db_ETL_Verarbeitung]\n GO\n GRANT UPDATE ON dbo.Spesensaetze TO [db_ETL_Verarbeitung]\n GO\n GRANT EXECUTE ON [dbo].[getDatumDate] TO [db_ETL_Verarbeitung]\n GO <\/pre>\n\n\n\n<p>Nun m\u00fcssen wir nur noch den User dieser Rolle zuweisen:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"sql\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">ALTER ROLE [db_ETL_Verarbeitung] ADD MEMBER [HOGWARTS\\Tobias]\n GO<\/pre>\n\n\n\n<p>Man kann Rollen auch verschachteln. So k\u00f6nnte man statt obigen GRANT SELECT auf dem Schema <em>dbo <\/em>die Rolle auch zum <em>data reader<\/em> machen. Deswegen entfernen wir erst das SELECT-Recht und f\u00fcgen dann die Rolle hinzu:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"sql\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">REVOKE SELECT ON SCHEMA::dbo TO [db_ETL_Verarbeitung]\n GO\n ALTER ROLE [db_datareader] ADD MEMBER [db_ETL_Verarbeitung]\n GO<\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Vorteil<\/h4>\n\n\n\n<p>Dieses Vorgehen hat auch den Vorteil, dass man die Berechtigungen an den einzelnen Objekten (z.B. Execute auf Stored Procedures) nicht auf User-Ebene sondern auf Rollen-Ebene definiert. Das kann zum Beispiel bei Verwendung der Redgate-Tools mit eingecheckt werden. Beim Deployment auf die Produktivserver wird diese Berechtigung dann mit bereitgestellt. Nur die User-Zuordnung zur Rolle muss der Integrator\/Administrator dann noch machen.<\/p>\n\n\n\n<p>Somit ist die Entwickler- und Administratoren\/Integratoren-T\u00e4tigkeit sauber getrennt.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Testen<\/h3>\n\n\n\n<p>Eine sch\u00f6ne M\u00f6glichkeit zu testen, ob die Rolle die richtigen Rechte hat, ist &#8222;<em>EXECUTE AS LOGIN<\/em>&#8222;. <\/p>\n\n\n\n<p>Damit impersoniert man sich als der betreffende User (hier HOGWARTS\\Tobias) und kann die Statements ausf\u00fchren und sehen, ob die Rechte entsprechend vorhanden sind.<\/p>\n\n\n\n<p>Das folgende Beispiel<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"sql\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">execute as login = 'hogwarts\\tobias'\n\n select * from Rechnungen\n\n update Spesensaetze\n set Gruppe_id = Gruppe_id\n where 1=0\n\n update Rechnungen\n set RechnungsJahr = RechnungsJahr\n where 1=0\n\n select [dbo].getDatumDate(20200101)<\/pre>\n\n\n\n<p>liefert als Ergebnis, dass die Statements 1, 2 und 4 ausgef\u00fchrt werden, Statement 3 liefert <br><\/p>\n\n\n\n<p>Meldung 229, Ebene 14, Status 5, Zeile 9<br>\nThe UPDATE permission was denied on the object &#8218;Rechnungen&#8216;, database &#8218;Faktura&#8216;, schema &#8218;dbo&#8216;.<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Motivation In diesem Artikel m\u00f6chte ich beschreiben, wie man eigene Datenbank-Rollen anlegt und diesen bestimmte Rechte gibt. Dies wird zum Beispiel ben\u00f6tigt, wenn man ETLs im SQL Server Agent ausf\u00fchren l\u00e4sst, die nat\u00fcrlich gewisse Rechte auf der Datenbank ben\u00f6tigen. Ich sehe es oft, dass die ausf\u00fchrenden User dann dbo-Rechte bekommen, da man (oder der Integrator) &hellip; <a href=\"https:\/\/www.csopro.de\/biblog\/2020\/04\/sql-server-spezifische-rollen-fuer-z-b-etl-verarbeitung\/\" class=\"more-link\"><span class=\"screen-reader-text\">SQL Server: spezifische Rollen f\u00fcr z.B. ETL-Verarbeitung<\/span> weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12],"tags":[51,50],"class_list":["post-440","post","type-post","status-publish","format-standard","hentry","category-sqlserver","tag-grant","tag-rolle"],"_links":{"self":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/440","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/comments?post=440"}],"version-history":[{"count":4,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/440\/revisions"}],"predecessor-version":[{"id":449,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/posts\/440\/revisions\/449"}],"wp:attachment":[{"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/media?parent=440"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/categories?post=440"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.csopro.de\/biblog\/wp-json\/wp\/v2\/tags?post=440"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}