从VIEW将记录插入表中

时间:2016-08-10 22:59:38

标签: sql sql-server tsql view

使用: SQL Server,SSMS 2008,T-SQL

目标:我想创建一个VIEW,无论何时调用它(例如select * from VIEW),它都会将记录插入另一个基本上表示当前日期时间的表中。其目的是跟踪调用VIEW的频率。

我尝试了什么:我尝试运行类似下面的VIEW伪代码,但失败了。

问题:这个目标可能吗?

USE DATABASE
GO
/****** Object:  View SCHEMA.VIEW1   Script Date: 08/10/2016 17:52:31 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

 CREATE VIEW SCHEMA.VIEW1 AS

 --Step 1: Update the LogTable with the current datetime so I will know that the VIEW was called on this date/time

 INSERT INTO DATABASE.SCHEMA.LogTable (DATE)
 VALUES (GETDATE())

 --Step 2: The "actual" VIEW code, select all records from TABLE1 (just as an example)

 SELECT *
 FROM DATABASE.SCHEMA.TABLE1

 GO

2 个答案:

答案 0 :(得分:0)

不,这是不可能的。视图只能读取数据。

答案 1 :(得分:0)

首先,在定义视图时,不能将记录插入到另一个表中。但是您可以创建SERVER AUDIT来审计SELECT语句。查询如下,请相应修改:)

在'主人'数据库,

CREATE SERVER AUDIT [select_audit] 
TO FILE(FILEPATH='E:\folder_name\') 
WITH (ON_FAILURE=FAIL_OPERATION, QUEUE_DELAY=0);

ALTER SERVER AUDIT [select_audit] WITH (STATE=ON);

在存在VIEW的目标数据库中,

CREATE DATABASE AUDIT SPECIFICATION [spec_test]
FOR SERVER AUDIT [select_audit]
ADD (SELECT ON OBJECT::[SCHEMAname].[VIEW name] BY [USER name])

在VIEW上执行选择操作

select * from dbo.view_test

检查文件夹以及此系统表以查看日志记录信息。您也可以将此信息插入审核表中。

SELECT * FROM sys.server_file_audits
SELECT * FROM sys.fn_get_audit_file('E:\folder_name\*', NULL, NULL);
SELECT * FROM sys.dm_server_audit_status

enter image description here