Поскольку первый пример действительно эквивалентен:
public DoStuff(int level)
{
// ...
int temp = level;
level = level + 1;
DoStuff(temp);
// ...
}
Записка, которую можно также написать ++ уровень; это было бы эквивалентно:
public DoStuff(int level)
{
// ...
level = level + 1;
DoStuff(level);
// ...
}
лучше не злоупотребить ++ и - операторы, по-моему; это быстро становится сбивающим с толку и/или неопределенным, что действительно происходит, и современные компиляторы C++ не генерируют более эффективный код с этими операторами так или иначе.
Это должно сработать:
CREATE PROC SProcs_GrantExecute(
@To AS NVARCHAR(255)
, @NameLike AS NVARCHAR(MAX)
, @SchemaLike as NVARCHAR(MAX) = N'dbo'
) AS
/*
Proc to Authorize a role for a whole bunch of SProcs at once
*/
DECLARE @sql as NVARCHAR(MAX)
SET @sql = ''
SELECT @sql = @sql + '
GRANT EXECUTE ON OBJECT::['+ROUTINE_SCHEMA+'].['+ROUTINE_NAME+'] TO '+@To+';'
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_NAME LIKE @NameLike
AND ROUTINE_SCHEMA LIKE @SchemaLike
PRINT @sql
EXEC(@sql)
Это, черт возьми, является инъекционным, поэтому оставьте его только для использования администратором.
Я просто хочу добавить, что предложение Ремуса об использовании схем является предпочтительным подходом, если это возможно.
Самый простой способ:
GRANT EXECUTE ON myproc TO x
где x =
вы можете это сделать, однако я не совсем уверен, насколько это безопасно.
/* CREATE A NEW ROLE */
CREATE ROLE db_executor
/* GRANT EXECUTE TO THE ROLE */
GRANT EXECUTE TO db_executor