none
Grant alter any table RRS feed

  • Frage

  • Hi,

    ich möchte gerne einer Datenbank-Rolle Ändern-Rechte auf alle Tabellen der DB zuweisen.

    Folgendes habe ich probiert:

    use [Database]

    GRANT ALTER ANY TABLE to [DB_Role]

    Bekomme als Rückgabe "Incorrect syntax near 'Alter'.

    Mache ich da was verkehrt?

    Grüße

    Julian

    Dienstag, 6. Juni 2017 12:07

Antworten

  • Hallo Julian,

    ich verstehe die Frage nicht. Wenn Du einer Person ALTER-Berechtigungen erteilen möchtest, dann musst Du ihn lediglich der Datenbankrolle [db_ddladmin] hinzufügen.

    Diese Rechte wirken sich auf ALLE Objekte aus.

    https://technet.microsoft.com/de-de/library/ms189121.aspx

    Eine andere Möglichkeit gibt es nicht!
    Wenn Du ein bestimmtes Recht auf alle Objekte in einem Schema erteilen möchtest, dann geht das wie folgt:

    GRANT SELECT ON SCHEMA::dbo TO PUBLIC;

    Um Berechtigungen auf einzelne Objekte zu erteilen, könntest Du mit Hilfe eines Cursors diese Berechtigungen erteilen:

    DECLARE @stmt NVARCHAR(128);
    
    DECLARE c CURSOR
    FOR
    	SELECT N'GRANT SELECT ON ' + QUOTENAME(SCHEMA_NAME(schema_id)) + N'.' + QUOTENAME(name) + N' TO User;'
    	FROM sys.tables;
    
    OPEN c
    FETCH NEXT FROM c INTO @stmt;
    WHILE @@FETCH_STATUS != -1
    BEGIN
    	EXEC sp_executesql @stmt;
    	FETCH NEXT FROM c INTO @stmt;
    END
    
    CLOSE c;
    DEALLOCATE c;
    


    Uwe Ricken (Blog | Twitter)
    Microsoft Certiied Master - SQL Server 2008
    Microsoft Certified Solution Master - CHARTER Data Platform
    Microsoft Certified Solution Expert - Data Platform
    db Berater GmbH
    Microsoft SQL Server Blog (german only)

    • Als Antwort markiert Julian79 Donnerstag, 8. Juni 2017 05:56
    Donnerstag, 8. Juni 2017 05:48

Alle Antworten

  • Hallo Julian,

    AFAICS gibt es dieses Konstrukt in Verbindung mit TABLE bei T-SQL nicht. Die Syntax passt wohl auf Oracle.

    Schau dir dazu bitte diesen MSDN Artikel an:

      GRANT (Datenbankberechtigungen) (Transact-SQL)

     


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Dienstag, 6. Juni 2017 12:30
    Moderator
  • Hallo Julian,

    um Tabellenstrukturen zu ändern, muss der User entweder der Eigentümer des Objekts (oder der Datenbank) sein oder aber er muss Mitglied der Gruppe [ddl_admin] sein.

    ALTER ROLE [db_ddladmin] ADD MEMBER [DatabaseUser];


    Uwe Ricken (Blog | Twitter)
    Microsoft Certiied Master - SQL Server 2008
    Microsoft Certified Solution Master - CHARTER Data Platform
    Microsoft Certified Solution Expert - Data Platform
    db Berater GmbH
    Microsoft SQL Server Blog (german only)

    Mittwoch, 7. Juni 2017 09:22
  • Danke für Eure Infos.

    Ich bin gerade auf der Suche nach einem Skript welches das "Grant-Alter-Recht" auf alle Tabellen einer Datenbank zu einer Datenbank-Rolle vergibt.

    Falls ihr einen Tipp für mich habt... :)

    Grüße

    Julian

    Mittwoch, 7. Juni 2017 13:24
  • Hallo Julian,

    ich verstehe die Frage nicht. Wenn Du einer Person ALTER-Berechtigungen erteilen möchtest, dann musst Du ihn lediglich der Datenbankrolle [db_ddladmin] hinzufügen.

    Diese Rechte wirken sich auf ALLE Objekte aus.

    https://technet.microsoft.com/de-de/library/ms189121.aspx

    Eine andere Möglichkeit gibt es nicht!
    Wenn Du ein bestimmtes Recht auf alle Objekte in einem Schema erteilen möchtest, dann geht das wie folgt:

    GRANT SELECT ON SCHEMA::dbo TO PUBLIC;

    Um Berechtigungen auf einzelne Objekte zu erteilen, könntest Du mit Hilfe eines Cursors diese Berechtigungen erteilen:

    DECLARE @stmt NVARCHAR(128);
    
    DECLARE c CURSOR
    FOR
    	SELECT N'GRANT SELECT ON ' + QUOTENAME(SCHEMA_NAME(schema_id)) + N'.' + QUOTENAME(name) + N' TO User;'
    	FROM sys.tables;
    
    OPEN c
    FETCH NEXT FROM c INTO @stmt;
    WHILE @@FETCH_STATUS != -1
    BEGIN
    	EXEC sp_executesql @stmt;
    	FETCH NEXT FROM c INTO @stmt;
    END
    
    CLOSE c;
    DEALLOCATE c;
    


    Uwe Ricken (Blog | Twitter)
    Microsoft Certiied Master - SQL Server 2008
    Microsoft Certified Solution Master - CHARTER Data Platform
    Microsoft Certified Solution Expert - Data Platform
    db Berater GmbH
    Microsoft SQL Server Blog (german only)

    • Als Antwort markiert Julian79 Donnerstag, 8. Juni 2017 05:56
    Donnerstag, 8. Juni 2017 05:48
  • Hallo Uwe,

    danke für die Erklärung, jetzt habe ich es verstanden! Bin noch relativ neu im SQL-Thema, daher meine Fragen... :-)

    Grüße

    Julian


    • Bearbeitet Julian79 Donnerstag, 8. Juni 2017 05:57
    Donnerstag, 8. Juni 2017 05:57
  • ...

    ich verstehe die Frage nicht. Wenn Du einer Person ALTER-Berechtigungen erteilen möchtest, dann musst Du ihn lediglich der Datenbankrolle [db_ddladmin] hinzufügen.

    Diese Rechte wirken sich auf ALLE Objekte aus.

    https://technet.microsoft.com/de-de/library/ms189121.aspx

    Eine andere Möglichkeit gibt es nicht!

    ...

    Autsch..!

    Eben weil ddl_admin dann ALLE Objektypen anfassen kann, inklusive erstellen und löschen, ist das keine gute Empfehlung. Von da zum db_owner ist es nicht mehr weit... Sicherheit muss man heute schon etwas genauer nehmen, weswegen ich mir diese Bemerkung erlaube.

    Selbst wenn es zum heutigen Zeitpunkt möglicherweise keine Sichten, Prozeduren, Funktionen etc gibt, können diese ja noch kommen – und dann mag man an diese Rollenmitgliedschaft nicht mehr denken.

    Neben dem Besitzer der Tabelle und der besagten weitreichenden Datenbankrolle gibt es übrigens doch auch auch ein ALTER-Recht für Tabellen. Leider müsst man dieses jedoch einzeln (z.B. via Cursor) vergeben, ein ALTER "ANY" gibt es ja, wie ihr korrekt herausgefunden habt, nicht.

    GRANT ALTER ON [schema].[table] TO [User]

    Was noch ginge: Wenn der Benutzer auch neue Tabellen erstellen dürfte, und Tabellen löschen darf, kann man mit einem Recht pro Schema auskommen ("ALTER SCHEMA") plus dem "CREATE TABLE"-Recht auf 1x auf Datenbankebene.

    -> Auch da ist er dann weder Besitzer noch ddl_admin.

    (Das gesamte Berechtigungskonzept wurde mit SQL Server 2005 deutlich angepasst - seit dem funktioniert das so.)


    Andreas Wolter (Blog | Twitter)
    MCSM: Data Platform / SQL Server 2012
       (Ja, zusätzlich auch "Charter Member", wie alle MCMs ihn tragen dürfen, aber vor allem auch geprüft und deswegen auch MCSM ohne den Zusatz "Charter" der für rein... gar Nichts steht.)
    MCM SQL Server 2008
    MVP Data Platform
    www.SarpedonQualityLab.com | www.andreas-wolter.com


    Freitag, 16. Juni 2017 22:01