Estou tentando descobrir uma combinação de permissões que permitirá a um parceiro ver o básico esquema db, mas não expor objetos incluindo código. Portanto,
- VIEW e SELECT em TABLES (incluindo chaves)
- Previne / DENY em views, Stored Procs, Functions.
Eu pensei em repassar e negar objetos individuais, mas isso não protegerá nenhum dos recém-criados.
Consideração adicional – preciso fazer isso para trabalhar no SQL Azure.
Resposta
Você pode criar uma função e conceder / revogar permissões para ela. Qualquer usuário que seja uma parte da função herdará as permissões.
Abaixo está um exemplo para você começar:
-- 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
Resposta
Acho que talvez você só precise de uma lista de objetos permitidos. Isso pode ser feito em um script como abaixo ou na definição de Ro le conforme descrito por Kin. Abaixo está um exemplo de concessão de direitos a um usuário usando uma variável de tabela que define a lista de objetos permitidos.
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
Resposta
No final, usei as funções datareader e datawriter para dar acesso aos dados. Em seguida, concedeu VIEW DEFINITION com o procedimento abaixo. Será necessário lembrar de manter isso …
Obrigado a todos.
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"
Comentários
- Eu sugiro creditar o autor do código: mssqltips.com/sqlservertip/1593/…