powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / DDLTrigger - access security
10 сообщений из 10, страница 1 из 1
DDLTrigger - access security
    #40100779
zindur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо временно потрекать object changes в базе (на какое время пока не известно)
Все евенты будут писаться в отдельную базу, например DBATools, так как на сервере будут несколько баз.
Скрипт/триггер будет создаваться на каждой базе.

Пример скрипта

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
CREATE OR ALTER TRIGGER DDLTriggerTrackingSchemaChanges
    ON DATABASE
    FOR DDL_DATABASE_LEVEL_EVENTS
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE
        @EventData XML = EVENTDATA();
 
    DECLARE @ip varchar(48) = CONVERT(varchar(48),CONNECTIONPROPERTY('client_net_address'));
 
    INSERT DBATools.dbo.DDLEvents
    (
        EventType,
        EventDDL,
        EventXML,
        DatabaseName,
        SchemaName,
        ObjectName,
        HostName,
        IPAddress,
        ProgramName,
        LoginName
    )
    SELECT
        @EventData.value('(/EVENT_INSTANCE/EventType)[1]',   'NVARCHAR(100)'), 
        @EventData.value('(/EVENT_INSTANCE/TSQLCommand)[1]', 'NVARCHAR(MAX)'),
        @EventData,
        DB_NAME(),
        @EventData.value('(/EVENT_INSTANCE/SchemaName)[1]',  'NVARCHAR(255)'), 
        @EventData.value('(/EVENT_INSTANCE/ObjectName)[1]',  'NVARCHAR(255)'),
        HOST_NAME(),
        @ip,
        PROGRAM_NAME(),
        SUSER_SNAME();
END



Проблема...
не все пользователи имеют допуск к базе DBATools и иммено к таблице DBATools.dbo.DDLEvents
И поэтому вылетает ошибка

Код: sql
1.
2.
Msg 916, Level 14, State 2, Line 3
The server principal "BLABLA_USER" is not able to access the database "DBATools" under the current security context



Как сделать чтоб все имели допуск хотябы на INSERT, и для новых пользователей тоже?
Спасибо
...
Рейтинг: 0 / 0
DDLTrigger - access security
    #40100781
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Особенно умиляет HOST_NAME().

Ну а так-то, дать роли public базы DBATools право на insert.
...
Рейтинг: 0 / 0
DDLTrigger - access security
    #40100782
zindur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222,

делал...

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
use [DBATools]
GO
GRANT INSERT TO [public]
GO

use [DBATools]
GO
GRANT INSERT ON [dbo].[DDLEvents] TO [public]
GO



но видимо чтото не доделал
...
Рейтинг: 0 / 0
DDLTrigger - access security
    #40100783
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пардон.
Дать guest право connect (включить) и право insert.

Код: sql
1.
GRANT CONNECT TO guest
...
Рейтинг: 0 / 0
DDLTrigger - access security
    #40100785
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно использовать сервис брокер

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
use DBATools

CREATE TABLE [dbo].[Logging](
	[LoggingID] [int] IDENTITY(1,1) NOT NULL,
	[EventTime] [datetime] not NULL,
	[EventType] [nvarchar](100) NULL,
	[LoginName] [nvarchar](50)  NULL,
	[UserName] [nvarchar](100)  NULL,
	[HostName] [nvarchar](50)  NULL,
	[DatabaseName] [nvarchar](50)  NULL,
	[SchemaName] [nvarchar](100)  NULL,
	[ObjectName] [nvarchar](100)  NULL,
	[ObjectType] [nvarchar](100)  NULL,
	[FullLog] [xml] NULL,
	[MessageType] [nvarchar](256)  NULL
) ON [PRIMARY]

alter table [dbo].[Logging] add constraint pk_logging primary key ([EventTime],[LoggingID])

CREATE PROCEDURE [dbo].[LoggingProc]
AS
SET NOCOUNT ON;

DECLARE     @message_body XML,
            @message_type_name NVARCHAR(256),
            @dialog UNIQUEIDENTIFIER ;

--Endless loop
WHILE (1 = 1)
BEGIN
   -- BEGIN TRANSACTION ;

    -- Receive the next available message

    WAITFOR (
        RECEIVE TOP(1) 
            @message_type_name=message_type_name,
            @message_body=message_body,  
            @dialog = conversation_handle  
            FROM LoggingQueue
    ), TIMEOUT 2000

	--Rollback and exit if no messages were found
	IF (@@ROWCOUNT = 0)
        BEGIN
            --ROLLBACK TRANSACTION ;
            BREAK ;
        END ;

   --End conversation of end dialog message

    IF (@message_type_name = 'http://schemas.microsoft.com/SQL/ServiceBroker/EndDialog')
    BEGIN
        PRINT 'End Dialog received for dialog # ' + cast(@dialog as nvarchar(40)) ;
        END CONVERSATION @dialog ;
    END ;
    ELSE
    BEGIN

	BEGIN TRY
			if @message_body.value('(/EVENT_INSTANCE/EventType)[1]','nvarchar(100)') <> 'CREATE_STATISTICS'
			begin

			INSERT INTO Logging (
			EventTime,
			EventType,
			LoginName,
			UserName,
			HostName,
			DatabaseName,
			SchemaName,
			ObjectName,
			ObjectType,
			FullLog,
			MessageType)
			VALUES
			(
			
			@message_body.value('(/EVENT_INSTANCE/PostTime)[1]','datetime'),
			@message_body.value('(/EVENT_INSTANCE/EventType)[1]','nvarchar(100)'),
			@message_body.value('(/EVENT_INSTANCE/LoginName)[1]','nvarchar(50)'),
			@message_body.value('(/EVENT_INSTANCE/UserName)[1]','nvarchar(100)'),
			@message_body.value('(/EVENT_INSTANCE/ServerName)[1]','nvarchar(50)'),
			@message_body.value('(/EVENT_INSTANCE/DatabaseName)[1]','nvarchar(50)'),
			@message_body.value('(/EVENT_INSTANCE/SchemaName)[1]','nvarchar(100)'),
			@message_body.value('(/EVENT_INSTANCE/ObjectName)[1]','nvarchar(100)'),
			@message_body.value('(/EVENT_INSTANCE/ObjectType)[1]','nvarchar(100)'),
			@message_body,
			@message_type_name)
			end
	END TRY

	BEGIN CATCH
		SELECT ERROR_NUMBER() AS ErrorNumber;
		raiserror('Error thrown from LoggingProc',16,1) with LOG
	END CATCH;

END 
--COMMIT TRANSACTION 
END 
go

ALTER DATABASE DBATools SET  ENABLE_BROKER 
GO

CREATE QUEUE [dbo].[LoggingQueue] WITH STATUS = ON , RETENTION = OFF , ACTIVATION (  STATUS = ON , PROCEDURE_NAME = [dbo].[LoggingProc] , MAX_QUEUE_READERS = 2 , EXECUTE AS OWNER  ) ON [PRIMARY] 
go

CREATE SERVICE [LoggingService]  AUTHORIZATION [dbo]  ON QUEUE [dbo].[LoggingQueue] ([http://schemas.microsoft.com/SQL/Notifications/PostEventNotification])
go

CREATE ROUTE [LoggingRoute]   AUTHORIZATION [dbo]   WITH  SERVICE_NAME  = N'LoggingService' ,  ADDRESS  = N'LOCAL' 
go


CREATE EVENT NOTIFICATION Logging_Event_Notification 
ON SERVER
FOR DDL_EVENTS
TO SERVICE 'LoggingService', 'current database'
GO
...
Рейтинг: 0 / 0
DDLTrigger - access security
    #40100794
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zindur,

авторНадо временно потрекать object changes в базе
DDLTrigger - это не удобно, настройте аудит.
...
Рейтинг: 0 / 0
DDLTrigger - access security
    #40100927
zindur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не работает :(

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
use [DBATools]
GRANT CONNECT TO guest

use [DBATools]
GO
GRANT INSERT TO [public]
GO

use [DBATools]
GO
GRANT INSERT ON [dbo].[DDLEvents] TO [public]
GO



aleks222
Пардон.
Дать guest право connect (включить) и право insert.

Код: sql
1.
GRANT CONNECT TO guest

...
Рейтинг: 0 / 0
DDLTrigger - access security
    #40100928
zindur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
интересно будем думать...
SERG1257,
...
Рейтинг: 0 / 0
DDLTrigger - access security
    #40100941
zindur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В моем случае Audit больше мороки ... (может я не прав) :(
базы в AWS-RDS там надо будет настроить и S3, потом несколько зон, пару десяток серверов...

Владислав Колосов
zindur,

авторНадо временно потрекать object changes в базе

DDLTrigger - это не удобно, настройте аудит.
...
Рейтинг: 0 / 0
DDLTrigger - access security
    #40100981
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zindur,

не знаю, что такое AWS-RDS и S3, аудит настраивается на SQL, возможно, придётся повозиться с фильтрами, чтобы не писал лишнее.
https://docs.microsoft.com/ru-ru/sql/relational-databases/security/auditing/sql-server-audit-database-engine?view=sql-server-ver15
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / DDLTrigger - access security
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]