2016-08-10 4 views
0

Verwendung: SQL Server, SSMS 2008 T-SQLLegen Sie einen Eintrag in eine Tabelle aus einer VIEW

Ziel: ich eine Ansicht erstellen möchten, wo, wann immer es (zum Beispiel select * from VIEW) genannt wird, Es wird einen Datensatz in eine andere Tabelle einfügen, die im Grunde die aktuelle Datetime angibt. Der Zweck ist, zu verfolgen, wie oft die Sicht aufgerufen wird.

Was ich versucht habe: Ich habe versucht, etwas wie die unten VIEW-Pseudo-Code ausgeführt, aber es ist fehlgeschlagen.

Frage: Ist dieses Ziel möglich?

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

Haben Sie es, indem Sie die Ansicht nennen müssen? Könnten Sie beispielsweise keine Prozedur erstellen, die aus der Ansicht auswählt und in die Protokolltabelle einfügt und stattdessen aufruft? – ZLK

+0

@ZLK Ich möchte die 'einfügen in' in den VIEW-Code im Gegensatz zu einer Prozedur, um nicht ausführen alle Berechtigungen für alle Mitarbeiter in der Datenbank zu geben. Stattdessen erhielten sie Schreibberechtigungen speziell für die LogTable. – Chase

+0

Naja, soweit ich weiß, ist es in einer Ansicht nicht wirklich möglich. Aber ich bin mir nicht sicher, was das Problem wäre, wenn man Benutzern die Erlaubnis für das Verfahren gibt, wenn es dasselbe tut. – ZLK

Antwort

0

Nein, das ist nicht möglich. Ansichten können nur Daten lesen.

+0

dachte ich, du sagst, dass du nicht in eine Ansicht einfügen kannst. Ich habe es falsch gelesen – scsimon

0

Als Erstes können Sie den Datensatz nicht in eine andere Tabelle einfügen, wenn Sie eine Ansicht definieren. Sie können jedoch SERVER AUDIT erstellen, um die SELECT-Anweisung zu überwachen. Abfrage wird wie folgt, ändern Sie es bitte :) entsprechend

Im 'Master' -Datenbank,

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); 

In der Zieldatenbank, wo Ihr VIEW existiert,

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

Sie den Wählvorgang auf Ihre Sicht

Überprüfen Sie den Ordner sowie diese Systemtabelle, um die Protokollierung zu sehen Information. Sie können diese Informationen auch in Ihre Überwachungstabelle einfügen.

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

Verwandte Themen