В любом случае, чтобы создать триггер DDL SQL Server для операторов «SELECT»? - PullRequest
8 голосов
/ 04 октября 2009

Я имею дело с некоторыми чувствительными таблицами учета и хотел бы проверить любой оператор SELECT, выполненный для таблицы, или любые связанные с ними представления.

Я не нашел ни одного события DDL на BOL (Books Online), имеющего какое-либо отношение к выражению SELECT. И триггеры DML предназначены только для INSERT, UPDATE и DELETE.

Можно ли регистрировать, кто обращается к таблице и представлениям с помощью оператора SELECT?

Ответы [ 6 ]

10 голосов
/ 04 октября 2009

Да, это возможно, создав Уведомление о событии для события AUDIT_DATABASE_OBJECT_ACCESS_EVENT . Затраты на то, чтобы сделать что-то подобное, были бы ошеломляющими.

Гораздо лучше использовать инфраструктуру аудита или использовать пользовательскую оболочку доступа, как рекомендует gbn.

9 голосов
/ 04 октября 2009

У вас есть 3 варианта:

  • разрешить доступ через хранимые процедуры, если вы хотите войти (и удалить права на таблицу)
  • скрыть таблицу за представлением, если вы хотите ограничить и сохранить «прямой» доступ
  • запустить постоянный след

Я бы выбрал варианты 1 или 2, потому что они являются частью вашего приложения и самодостаточны.

Хотя для начала регистрации это звучит немного поздно: доступ к столу должен был быть ограничен заранее.

Кроме того, любое решение дает сбой, если конечные пользователи не вносят исправления напрямую (например, через веб-сервер или учетную запись службы). Если вы не используете сохраненные процедуры для отправки имени конечного пользователя ...

Посмотреть пример:

CREATE VIEW dbo.MyTableMask
AS
SELECT *
FROM
    MyTable
    CROSS JOIN
    (SELECT 1 FROM SecurityList WHERE name = SUSER_SNAME())
--WHERE could use NOT EXISTS too with table
GO
2 голосов
/ 30 января 2015
    --In the master database create a server audit
USE master
GO
CREATE SERVER AUDIT [Audit_Select_HumanResources_Employee]
TO FILE
(     FILEPATH = N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup'
      ,MAXSIZE = 0 MB
      ,MAX_ROLLOVER_FILES = 2147483647
      ,RESERVE_DISK_SPACE = OFF)
WITH
(QUEUE_DELAY = 1000, state=  on)

ALTER SERVER AUDIT Audit_Select_HumanResources_Employee 
WITH (STATE = ON) ;
GO
--In the database to monitor create a database audit
USE [AdventureWorks2012]
go

CREATE DATABASE AUDIT SPECIFICATION [Database-Audit]
FOR SERVER AUDIT [Audit_Select_HumanResources_Employee]
--In this example, we are monitoring the humanResources.employee
ADD (SELECT ON OBJECT::[HumanResources].[Employee] BY [dbo])
with (state=on)

--Now you can see the activity in the audit file created
SELECT * FROM sys.fn_get_audit_file ('c:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Backup\Audit_Select_HumanResources_Employee.sqlaudit',default,default);
GO

Я только что добавил код для вас. Код создает аудит сервера, аудит базы данных для выбранных операций и, наконец, файл sys.fn_get_audit_file используется для извлечения информации из файла. Вы должны сделать это индивидуально для каждого стола. Если вы хотите более автоматизированный запрос, вы можете использовать другие инструменты, такие как Apex SQL Audit или другой сторонний инструмент по вашему выбору.

1 голос
/ 04 октября 2009

Аудит SQL Server 2008 может быть в состоянии перехватить его. Кроме этого, Profiler / Tracing - единственное, что может сделать это в SQL Server.

1 голос
/ 04 октября 2009
0 голосов
/ 14 августа 2015
CREATE PROCEDURE sp_Product_Select @User_Name VarChar(128), @ID Int AS
INSERT INTO My_Trace_Table (Table_Name, User_Name, Table_ID, Select_DateTime)
VALUES ('Products', @User_Name, @ID, GetDate())

SELECT *
FROM Products
WHERE ID = @ID
RETURN
GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...