2009-10-04 77 views

回答

9

你有3种选择:

  • 允许通过存储过程,如果你想记录(和删除表权限)
  • 隐藏视图背后的表,如果要限制,并保持“直接”访问访问
  • 运行一个永久的痕迹

我会去选择1或2,因为他们是你的应用程序和自我的一部分包含。

虽然这听起来有点迟,开始记录:访问表应该被限制在前面。

此外,如果最终用户不直接更正(例如通过Web服务器或服务帐户),任何解决方案都会失败。除非你使用存储的特效中端用户名发送...

查看示例:

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 
1

SQL Server 2008中审计可以能够捕捉到它。除此之外,Profiler/Tracing是SQL Server中唯一可以实现的功能。

+0

我也一直在寻找到SQL Server 2008的审核,但不幸的是,我现在处理的SQL Server 2005。我想知道是否可以从开发服务器(2008)创建生产服务器(2005)的链接,然后使用审计。 – Sung 2009-10-04 21:15:32

+0

此外,它只是企业。 – Oliver 2013-06-28 19:52:03

10

是的,有可能通过在AUDIT_DATABASE_OBJECT_ACCESS_EVENT事件创建Event Notification。尽管如此,做这样的事情的代价是巨大的。

使用audit infrastructure或使用gbn建议的自定义访问包装要好得多。

+0

我还没有听说过事件通知,这听起来很有希望。 – Sung 2009-10-04 21:19:52

+5

我必须再次强调,为数据库中的每个对象访问检查生成一个事件将是非常重量级的。 – 2009-10-04 23:32:12

2
--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或您偏好的其他第三方工具。

0
 
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 
+0

这不是一个触发器。 – 2018-01-08 16:41:52