Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 доступ на запись в базу для всех пользователей (существующих и будущих)  [new]
solonafendere
Member

Откуда:
Сообщений: 17
Всем добрый день!
Подскажите, у меня есть SQL Server 2008 (Standard). Надо было настроить примитивный аудит (отлавливать DDL эвенты). Сделал это через триггер, который пишет в определённую базу. И когда какой-нибудь юзверь что-то там меняет, ему выдаёт ошибку, что прав на запись в таблицу с аудитом нет.

Есть ли вариант создать группу, куда будут добавлены все пользователи (и будут добавляться новые!), чтобы явно не прописывать для каждого пользователя права на запись в таблицу?
Заранее спасибо за ответ!
19 апр 16, 13:47    [19077192]     Ответить | Цитировать Сообщить модератору
 Re: доступ на запись в базу для всех пользователей (существующих и будущих)  [new]
iljy
Member

Откуда:
Сообщений: 8711
solonafendere,

это будет очень стремный аудит, учитывай, что любой пользователь может любую запись из этого аудита удалить или изменить. Дайте права конкретно триггеру (EXECUTE AS)
19 апр 16, 13:53    [19077246]     Ответить | Цитировать Сообщить модератору
 Re: доступ на запись в базу для всех пользователей (существующих и будущих)  [new]
Glory
Member

Откуда:
Сообщений: 104760
solonafendere
Есть ли вариант создать группу, куда будут добавлены все пользователи (и будут добавляться новые!), чтобы явно не прописывать для каждого пользователя права на запись в таблицу?

Есть встроенная роль(а не группа) public. В нее попадают все пользователи базы автоматически.

solonafendere
у меня есть SQL Server 2008 (Standard). Надо было настроить примитивный аудит (отлавливать DDL эвенты). Сделал это через триггер, который пишет в определённую базу.

https://msdn.microsoft.com/en-us/library/cc280448(v=sql.105).aspx
19 апр 16, 13:55    [19077269]     Ответить | Цитировать Сообщить модератору
 Re: доступ на запись в базу для всех пользователей (существующих и будущих)  [new]
invm
Member

Откуда: Москва
Сообщений: 9396
solonafendere
Есть ли вариант создать группу
Есть вариант создать роль. Но, как уже писал iljy, это весьма стремно.

Откажитесь от триггера и сделайте аудит DDL'я на основе Service Broker и Event Notification уровня сервера.
Тогда не потребуется раздавать права и пользователи БД вообще не будут знать, что их DDL-активность логируется.
19 апр 16, 13:59    [19077316]     Ответить | Цитировать Сообщить модератору
 Re: доступ на запись в базу для всех пользователей (существующих и будущих)  [new]
solonafendere
Member

Откуда:
Сообщений: 17
invm, iljy,
будет "странный", даже если права будут только на insert?
Glory,
у меня SQL 2008 Standard, там не доступны средства Audit.
19 апр 16, 15:20    [19078058]     Ответить | Цитировать Сообщить модератору
 Re: доступ на запись в базу для всех пользователей (существующих и будущих)  [new]
Glory
Member

Откуда:
Сообщений: 104760
solonafendere
Glory,
у меня SQL 2008 Standard, там не доступны средства Audit.

Трассировка есть везде. А с sql2005 вообще есть default trace
19 апр 16, 15:24    [19078117]     Ответить | Цитировать Сообщить модератору
 Re: доступ на запись в базу для всех пользователей (существующих и будущих)  [new]
iljy
Member

Откуда:
Сообщений: 8711
solonafendere
invm, iljy,
будет "странный", даже если права будут только на insert?


Ну мало ли кто что туда навставляет. Зачем такие развлечения?
19 апр 16, 15:43    [19078308]     Ответить | Цитировать Сообщить модератору
 Re: доступ на запись в базу для всех пользователей (существующих и будущих)  [new]
solonafendere
Member

Откуда:
Сообщений: 17
iljy
solonafendere,

это будет очень стремный аудит, учитывай, что любой пользователь может любую запись из этого аудита удалить или изменить. Дайте права конкретно триггеру (EXECUTE AS)


iljy,
Пытаюсь воплотить этот вариант. Но, похоже, он не пашет.
use DB_TEST
GO
CREATE TRIGGER trgLogDatabaseSecurityEvents ON DATABASE
WITH EXECUTE AS 'TriggerDBWrite'
    FOR DDL_DATABASE_SECURITY_EVENTS
AS
    DECLARE @data XML
    SET @data = EVENTDATA()
    INSERT  INTO AUDITDB.DBO.DDL_LOG_AUDIT
         (
         EventType,
         ObjectName,
         ObjectType,
		 DatabaseName,
         TSQL
         )
    VALUES  
         (
         @data.value('(/EVENT_INSTANCE/EventType)[1]', 'nvarchar(100)'),
         @data.value('(/EVENT_INSTANCE/ObjectName)[1]', 'nvarchar(100)'),
         @data.value('(/EVENT_INSTANCE/ObjectType)[1]', 'nvarchar(100)'),
         @data.value('(/EVENT_INSTANCE/DatabaseName)[1]', 'nvarchar(max)'),
         @data.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'nvarchar(max)')
         ) 
GO

Триггер создался, но не отлавливает ничего...
Создал логин TriggerDBWrite, включил его в роль DB_TRIGGER_INSERT в базе AUDITDB, у которой есть права на таблицу с аудитом.
Триггер стоит на базе DB_TEST, а записывать должен в другую базу, AUDITDB.
Это как-то связано с TRUSTWORTHY??
20 апр 16, 15:58    [19083742]     Ответить | Цитировать Сообщить модератору
 Re: доступ на запись в базу для всех пользователей (существующих и будущих)  [new]
Glory
Member

Откуда:
Сообщений: 104760
solonafendere
Триггер создался, но не отлавливает ничего...

Для того, чтобы триггер что-то "отлавливал", должны происходить события, которые он "отлавливает"

solonafendere
Создал логин TriggerDBWrite, включил его в роль DB_TRIGGER_INSERT в базе AUDITDB, у которой есть права на таблицу с аудитом.
Триггер стоит на базе DB_TEST, а записывать должен в другую базу, AUDITDB.
Это как-то связано с TRUSTWORTHY??


DDL Triggers with Database Scope
{ EXEC | EXECUTE } AS { CALLER | SELF | 'user_name' }
' user_name '
Указывает, что инструкции, содержащиеся в модуле, выполняются в контексте пользователя, указываемого аргументом user_name. Разрешения на объекты, на которые ссылается модуль, проверяются для этого пользователя.

Вы разницу между login и user знаете ?
20 апр 16, 17:21    [19084392]     Ответить | Цитировать Сообщить модератору
 Re: доступ на запись в базу для всех пользователей (существующих и будущих)  [new]
solonafendere
Member

Откуда:
Сообщений: 17
Glory,
В базе, на которую установил триггер, создал и удалил таблицу, вьюшку, юзера. Это триггер не записал.

На уровне сервера я создал логин TriggerDBWrite, затем в базе с аудитом добавил его в роль, которая имеет доступ на запись в таблицу (группа была создана давно, по этому решил тупо туда и добавить логин). В базе аудит появился юзер TriggerDBWrite.

Видимо, я не понимаю как работает этот execute as... Получается, что этот юзер должен быть в базе, в которой включён этот триггер и в базе в которую он пишет?
21 апр 16, 09:25    [19086312]     Ответить | Цитировать Сообщить модератору
 Re: доступ на запись в базу для всех пользователей (существующих и будущих)  [new]
Glory
Member

Откуда:
Сообщений: 104760
solonafendere
В базе, на которую установил триггер, создал и удалил таблицу, вьюшку, юзера. Это триггер не записал.

Что в тексте триггерв указывает на то, что он был должен "отловить" именно эти события ?

solonafendere
Видимо, я не понимаю как работает этот execute as...

Вы не понимаете, что там вообще написано в синтаксисе.
Там написано, что в DDL Triggers with Database Scope для EXECUTE AS можно задать только имя пользователя этой базы. А не любой другой базы.
21 апр 16, 09:32    [19086339]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить