Роли и разрешения SQL Server

На основе this solution для нахождения корреляционной матрицы между двумя 2D массивами мы можем иметь аналогичный для нахождения корреляционный вектор, который вычисляет корреляцию между соответствующими строками в двух массивах. Реализация будет выглядеть примерно так:

def corr2_coeff_rowwise(A,B):
    # Rowwise mean of input arrays & subtract from input arrays themeselves
    A_mA = A - A.mean(1)[:,None]
    B_mB = B - B.mean(1)[:,None]

    # Sum of squares across rows
    ssA = (A_mA**2).sum(1);
    ssB = (B_mB**2).sum(1);

    # Finally get corr coeff
    return np.einsum('ij,ij->i',A_mA,B_mB)/np.sqrt(ssA*ssB)

Мы также можем оптимизировать часть, чтобы получить ssA и ssB, введя там магию einsum!

def corr2_coeff_rowwise2(A,B):
    A_mA = A - A.mean(1)[:,None]
    B_mB = B - B.mean(1)[:,None]
    ssA = np.einsum('ij,ij->i',A_mA,A_mA)
    ssB = np.einsum('ij,ij->i',B_mB,B_mB)
    return np.einsum('ij,ij->i',A_mA,B_mB)/np.sqrt(ssA*ssB)

Прогон образца -

In [164]: M1 = np.array ([
     ...:     [1, 2, 3, 4],
     ...:     [2, 3, 1, 4.5]
     ...: ])
     ...: 
     ...: M2 = np.array ([
     ...:     [10, 20, 33, 40],
     ...:     [20, 35, 15, 40]
     ...: ])
     ...: 

In [165]: corr2_coeff_rowwise(M1, M2)
Out[165]: array([ 0.99411402,  0.96131896])

In [166]: corr2_coeff_rowwise2(M1, M2)
Out[166]: array([ 0.99411402,  0.96131896])

Тест времени выполнения -

In [97]: M1 = np.random.rand(256,200)
    ...: M2 = np.random.rand(256,200)
    ...: 

In [98]: out1 = np.diagonal (np.corrcoef (M1, M2), M1.shape [0])
    ...: out2 = corr2_coeff_rowwise(M1, M2)
    ...: out3 = corr2_coeff_rowwise2(M1, M2)
    ...: 

In [99]: np.allclose(out1, out2)
Out[99]: True

In [100]: np.allclose(out1, out3)
Out[100]: True

In [101]: %timeit np.diagonal (np.corrcoef (M1, M2), M1.shape [0])
     ...: %timeit corr2_coeff_rowwise(M1, M2)
     ...: %timeit corr2_coeff_rowwise2(M1, M2)
     ...: 
100 loops, best of 3: 9.5 ms per loop
1000 loops, best of 3: 554 µs per loop
1000 loops, best of 3: 430 µs per loop

20x+ ускорился там, где einsum над встроенным np.corrcoef!

0
задан carlosm 26 March 2019 в 21:28
поделиться

1 ответ

Короткий ответ: , вы не можете .

Как правило, разрешения на уровне сервера не распространяются на отдельные объекты в базах данных. Единственным исключением является роль 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. Несмотря на это, я надеюсь, что вы не собираетесь управлять производственными базами данных таким образом. Я даже не знаю, с чего начать, насколько небезопасен этот подход.

0
ответ дан Roger Wolf 26 March 2019 в 21:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: