Ich versuche, eine Kombination von Berechtigungen zu finden, die es einem Partner ermöglichen, grundlegende Informationen anzuzeigen Datenbankschema, aber keine Objekte einschließlich Code verfügbar machen.
- ANZEIGEN und AUSWÄHLEN für TABELLEN (einschließlich Schlüssel)
- Verhindern / VERWEIGERN von Ansichten, gespeicherten Prozessen, Funktionen.
Ich habe darüber nachgedacht, einzelne Objekte durchzugehen und zu verweigern, aber dies schützt keine neu erstellten Objekte.
Zusätzliche Überlegungen – ich muss dies tun Arbeiten Sie in SQL Azure.
Antwort
Sie können eine Rolle erstellen und ihr dann Berechtigungen erteilen / entziehen. Jeder Benutzer Ein Teil der Rolle erbt die Berechtigungen.
Nachfolgend finden Sie ein Beispiel für den Einstieg:
-- Create the database role CREATE ROLE TableSelector AUTHORIZATION [dbo] GO ---- Grant access rights to a specific schema in the databas GRANT SELECT ON SCHEMA::dbo TO TableSelector GO -- Add an existing user to the new role created EXEC sp_addrolemember "TableSelector", "MyDBUser" GO -- Revoke access rights on a schema from a role DENY ALTER -- you can customize here ... ON SCHEMA::dbo TO TableSelector
Antwort
Ich denke, Sie benötigen möglicherweise nur eine zulässige Liste von Objekten. Dies kann in einem Skript wie unten oder in der Definition von Ro erfolgen le wie von Kin beschrieben. Im Folgenden finden Sie ein Beispiel für die Gewährung von Rechten an einen Benutzer mithilfe einer Tabellenvariablen, die die Liste der zulässigen Objekte definiert.
DECLARE @AllowedObjects AS TABLE( name SYSNAME ) INSERT INTO @AllowedObjects SELECT N"dbo.Table1" UNION SELECT N"dbo.Table2" DECLARE @name SYSNAME DECLARE names CURSOR FOR SELECT name FROM @AllowedObjects OPEN names FETCH NEXT FROM names INTO @name WHILE(@@FETCH_STATUS <> -1) BEGIN IF (@@FETCH_STATUS <> -2) BEGIN EXEC ("GRANT SELECT ON OBJECT::" + @name + " TO userName") END FETCH NEXT FROM names INTO @name END CLOSE names DEALLOCATE names
Antwort
Am Ende habe ich Datenleser- und Datenschreiberrollen verwendet, um Zugriff auf die Daten zu gewähren. Dann gewährt VIEW DEFINITION mit dem folgenden proc. Muss daran denken, dies beizubehalten …
Vielen Dank an alle.
Create PROCEDURE GrantViewDefinitionOnTables (@login VARCHAR(30)) AS begin /* Included Object Types are: P - Stored Procedure V - View FN - SQL scalar-function TR - Trigger IF - SQL inlined table-valued function TF - SQL table-valued function U - Table (user-defined) */ SET NOCOUNT ON CREATE TABLE #runSQL (runSQL VARCHAR(2000) NOT NULL) --Declare @execSQL varchar(2000), @login varchar(30), @space char (1), @TO char (2) DECLARE @execSQL VARCHAR(2000), @space CHAR (1), @TO CHAR (2) SET @to = "TO" SET @execSQL = "Grant View Definition ON " SET @login = REPLACE(REPLACE (@login, "[", ""), "]", "") SET @login = "[" + @login + "]" SET @space = " " INSERT INTO #runSQL SELECT @execSQL + schema_name(schema_id) + "." + [name] + @space + @TO + @space + @login FROM sys.all_objects s -- Want the view permission to sp, view, trigger then add type code mention in above. eg: where type IN("P","V","FN",TR","IF","TF","U") WHERE type IN ("U") AND is_ms_shipped = 0 ORDER BY s.type, s.name SET @execSQL = "" Execute_SQL: SET ROWCOUNT 1 SELECT @execSQL = runSQL FROM #runSQL PRINT @execSQL --Comment out if you don"t want to see the output EXEC (@execSQL) DELETE FROM #runSQL WHERE runSQL = @execSQL IF EXISTS (SELECT * FROM #runSQL) GOTO Execute_SQL SET ROWCOUNT 0 DROP TABLE #runSQL end ------------------------ EXEC GrantViewDefinitionOnTables "MyDatabase"
Kommentare
- Ich würde vorschlagen, den Autor des Codes gutzuschreiben: mssqltips.com/sqlservertip/1593/…