IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MS SQL Server Discussion :

Audit d'accès à des vues, procédures et OPENQUERY [2012]


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de Jester
    Inscrit en
    Septembre 2003
    Messages
    813
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 813
    Par défaut Audit d'accès à des vues, procédures et OPENQUERY
    Bonjour,

    J'aimerais mettre en place un audit d'accès à des données d'un serveur SQL Server 2012. Mon besoin et qu'une table soit remplie d'une ligne d'audit à chaque fois qu'un utilisateur exécute une vue.

    Je tente de passer par une procédure stockée qui contient le SELECT de la vue ainsi qu'un INSERT dans la table d'audit. Je bloque à créer la vue qui exécute cette procédure stockée.

    J'ai trouvé la source de l'erreur je suppose sur ce site. L'OPENQUERY semble faire un rollback.

    Ci-dessous un code de test, [SELF] est un serveur lié qui pointe sur localhost. La première exécution insert bien une ligne dans la table d'audit mais pas quand je l'appelle par OPENQUERY. J'ai aussi essayé OPENROWSET, Utiliser OLEDB en place du client natif, ... rien n'y fait. Je suis prenneur si vous avez des idées.

    Merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    create table dbo.stored_procedure_log (
    	sp_schema varchar(255),
    	sp_name varchar(255),
    	sp_user varchar(255),
    	start_time datetime,
    	duration int default 0
    );
    go
     
    create procedure sp_dummy
    as 
    begin
    select 1 as col1, 2 as col2;
    insert into dbo.stored_procedure_log(sp_schema,sp_name,sp_user,start_time) 
    	values ('dbo','dummy','toto',getdate());
    end;
    go
     
    exec sp_dummy;
     
    -- On vérifie qu'une ligne d'audit a bien été mise
    select * from dbo.stored_procedure_log;
     
     
    select * from OPENQUERY([SELF], '
    	exec master.dbo.sp_dummy;
    ');
     
    -- La ligne d'audit n'a pas été insérée
    select * from dbo.stored_procedure_log;

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 998
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 998
    Billets dans le blog
    6
    Par défaut
    Au lieu d'utiliser une telle usine à gaz, utilisez les outils adéquats et performants comme DATABASE AUDIT !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    -- mise en place du stockage de l'audit
    USE master;
    GO
    CREATE SERVER AUDIT SAD_VUE
        TO FILE ( FILEPATH ='C:\TEMP\AUDIT_SQL\' );
    GO
    ALTER SERVER AUDIT SAD_VUE 
    WITH (STATE = ON) ;
    GO
     
    -- mise en place d'un objet à auditer
    USE MABASE
    GO
    CREATE DATABASE AUDIT SPECIFICATION ADS_VUE
    FOR SERVER AUDIT SAD_VUE
    ADD (SELECT 
         ON dbo.MMavue BY dbo )
    WITH (STATE = ON) ;
    GO
     
    -- pour lire les auditions effectuées :
    SELECT * 
    FROM sys.fn_get_audit_file ('C:\TEMP\AUDIT_SQL\*', default, default);
    GO
    Bref, formez-vous à SQL Server... Venez par exemple à un de mes cours Admin à Orsys !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre émérite Avatar de Jester
    Inscrit en
    Septembre 2003
    Messages
    813
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 813
    Par défaut
    Merci pour cette idée. Je l'avais déjà explorée car effectivement elle est plus logique. Malheureusement, je n'ai que la version BI de SQL Server donc pas d'audit fin.

    Le coté usine à gaz n'est pas trop dérangeant pour mon usage, je n'ai pas besoin de performances incroyables et les scripts seront générés et déployés de manière automatisées.

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Citation Envoyé par Jester Voir le message
    Le coté usine à gaz n'est pas trop dérangeant pour mon usage, ...
    Dans ce cas, (et uniquement dans ce cas ) coupez lui l'herbe sous le pied et forcez la validation de la transaction, en faisant un commit juste après votre INSERT.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    CREATE procedure sp_dummy
    AS 
    begin
    SELECT 1 AS col1, 2 AS col2;
    INSERT INTO dbo.stored_procedure_log(sp_schema,sp_name,sp_user,start_time) 
    	VALUES ('dbo','dummy','toto',getdate());
    COMMIT TRAN
     
    end;

  5. #5
    Membre émérite Avatar de Jester
    Inscrit en
    Septembre 2003
    Messages
    813
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 813
    Par défaut
    Bonne piste. Merci

    L'emplacement indiqué ne fonctionnait pas. Mais si je le met dans le openquery directement ça fonctionne. Après réflexion, ça fait sens. J'ai pus faire le test sur un cas concret et quand on rafraichit un lien ODBC sur la vue dans un Excel (mon objectif), j’obtiens bien l'info.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CREATE VIEW v_dummy as 
    select * from OPENQUERY([SELF], '
    	exec master.dbo.sp_dummy;
    	commit;
    ');

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [WD20] C/S accès à une vue matérialisée depuis procédure stockée
    Par xavier.ninane dans le forum WinDev
    Réponses: 0
    Dernier message: 03/05/2015, 19h21
  2. Réponses: 4
    Dernier message: 19/02/2015, 16h41
  3. [PERFORMANCE] acces a des vues
    Par Valkirion dans le forum Requêtes
    Réponses: 2
    Dernier message: 27/03/2009, 13h42
  4. importer des "vues" d acces en Interbase
    Par tchaman dans le forum InterBase
    Réponses: 1
    Dernier message: 18/01/2005, 17h56
  5. [Crystal Report] Utilisation des vues de sql serveur
    Par Olivierakadev dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 15/11/2002, 17h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo