Короткий ответ: , вы не можете .
Как правило, разрешения на уровне сервера не распространяются на отдельные объекты в базах данных. Единственным исключением является роль sysadmin
, которую я настоятельно рекомендую вам , а не использовать для этой цели, поскольку вы по существу передадите контроль над всем экземпляром сервера каждому члену. [1111 ]
В качестве краткости вы можете использовать встроенные роли базы данных, чтобы избавить себя от проблем. Для доступа только для чтения обычно достаточно членства в роли db_datareader
, если только у вас нет хранимых процедур, которые возвращают наборы данных, которые эта роль должна выполнять. Существует также аналогичная роль для модификации, db_datawriter
, но она не распространяется на разрешение execute
. Таким образом, для этого вам нужно будет создать собственную роль:
create role [DataChanger] authorization [dbo];
go
alter role [db_datareader] add member [DataChanger];
go
alter role [db_datawriter] add member [DataChanger];
go
grant execute to [DataChanger];
go
-- Now you can add your members. Here is a reader
create user [Domain\MyUser1] from login [Domain\MyUser1];
go
alter role [db_datareader] add member [Domain\MyUser1];
go
-- Writer
create user [Domain\MyUser2] from login [Domain\MyUser2];
go
alter role [DataChanger] add member [Domain\MyUser2];
go
Эти разрешения будут автоматически выбирать вновь созданные объекты, без необходимости явного добавления новых разрешений после каждой модификации схемы.
Вам придется делать это в контексте каждой пользовательской базы данных, которой вы хотите управлять таким образом. Вероятно, вы можете создать задание агента SQL, которое будет запускаться периодически, и вносить эти изменения в любые пользовательские базы данных, у которых их еще нет (например, если база данных была восстановлена из более ранней резервной копии, или перенесена с другого сервера, или нового один был создан). Кроме того, поскольку вы не можете циклически проходить по базам данных в статическом коде, вам нужно будет обернуть его в динамический SQL и выполнить цикл по sys.databases
или, возможно, с помощью недокументированной системной хранимой процедуры . Да, и не забудьте удалить все эти операторы go
из динамического кода, поскольку они не являются частью SQL и распознаются только SSMS и sqlcmd
.
P.S. Несмотря на это, я надеюсь, что вы не собираетесь управлять производственными базами данных таким образом. Я даже не знаю, с чего начать, насколько небезопасен этот подход.
То же самое.
int[][] tests = {
{2, 4},
{3, 9},
{10, 100}
};
for (int[] test : tests) {
assertEquals(test[1], f(test[0]));
}
Конечно, не настолько симпатичный, как Python, но немного вещей.
Можно также хотеть изучить Теории JUnit, будущую функцию...
Взгляните на Параметризованный исполнитель тестов в Junit.
http://junit.org/apidocs/org/junit/runners/Parameterized.html
Похоже, что это сделает точно, что Вы ищете.
Правильный путь пишет отдельные операторы контроля, даже если Вам не нравится он.
Это избегает ненужных сложностей, и когда это перестало работать, иногда легче видеть, какое значение перестало работать (никакая потребность запустить отладчик).
Однако при генерации данных тестирования автоматически, это - другая история.
Вы только определили бы простой класс с двумя полями, реальным результатом и ожидаемым результатом и затем циклом по набору похожим способом к тому, что делает Ваш отрывок Python?
Гм...
int[][] tests = new int[][]{
{2, 4},
{3, 9},
{10, 100},
};
for(int[] i : tests)
{
assertEquals(i[1], f(i[0]);
}
То же самое, действительно. Единственной проблемой является отсутствие Java литерала кортежа, таким образом, для более сложных случаев, необходимо будет использовать Объект [] массивы и бросить или записать класс Кортежа.
Определенно не эксперт по поблочному тестированию, но я предпочел бы иметь отдельный метод для каждого случая, против которого я тестирую и использую некоторый тест рабочие инструменты (как NUnit-GUI для C#). Тем путем я точно знал бы, какой случай перестал работать, если он делает. Его больше работы, чтобы сделать, но я думаю, что она в конечном счете окупается хорошо.
В Java нет никаких кортежей, но Вы могли использовать Карту или два параллельных массива, чтобы указать пар ввода/вывода и затем сделать цикл точно так же, как Ваш пример Python.