2008-08-15 4 views
4

Donc, fondamentalement, je construis une application pour mon entreprise et il doit être construit en utilisant MS Access et il doit être construit sur SQL Server.Construction d'un système d'audit; MS Access frontend sur SQL Server backend

J'ai élaboré la plupart des plans, mais j'ai de la difficulté à trouver un moyen de gérer le système d'audit. Comme il est uniquement utilisé en interne et que vous ne pouvez même pas toucher la db depuis l'extérieur du bâtiment, nous n'utilisons pas de système de connexion car le programme ne sera utilisé qu'une fois que l'utilisateur est déjà connecté à notre site. réseau interne via Active Directory. Sachant cela, nous utilisons a system to detect automatically the name of the Active Directory user et avec leurs permissions dans l'une des tables DB, décidant ce qu'ils peuvent ou ne peuvent pas faire. Donc, la table d'audit aura 3 colonnes (cette conception peut changer mais pour cette question, peu importe); qui (Utilisateur Active Directory), quand (heure d'ajout/suppression/édition), quoi (ce qui a été changé)

Ma question est comment dois-je gérer cela. Idéalement, je sais que je devrais utiliser un déclencheur pour qu'il soit impossible de mettre à jour la base de données sans qu'un audit soit enregistré, mais je ne sais pas comment je pourrais saisir l'utilisateur Active Directory de cette façon. Une alternative serait de le coder directement dans la source d'accès de sorte que chaque fois que quelque chose change, j'exécute une instruction INSERT. Évidemment, cela est défectueux parce que si quelque chose arrive à Access ou si la base de données est touchée par quelque chose d'autre, il ne consignera pas l'audit.

Tous les conseils, exemples ou articles qui pourraient m'aider seraient grandement appréciés!

+0

Si vous ne travaillez pas, ajoutez toujours les mêmes choses via la gâchette. Aussi je devrais mentionner que j'utilise ODBC pour se connecter ... –

Répondre

0

Combien d'utilisateurs de l'application y aura-t-il? Est-il possible d'utiliser l'authentification intégrée de Windows pour l'authentification SQL?

Mise à jour: Si vous pouvez attribuer à chaque utilisateur une connexion SQL (Windows intégrée), vous pouvez récupérer l'utilisateur connecté à l'aide de la fonction SYSTEM_USER.

+0

@KevinKenny Je dirais quelque chose comme 10-30 avec un potentiel pour plus dans le futur. Je n'ai jamais vraiment entendu ou utilisé l'authentification intégrée de Windows pour le serveur SQL. Est-ce facile/sécurisé? Des choses comme ça peuvent être plus difficiles à vendre au patron. :/ –

2

Est-ce que cela fonctionne pour vous?


select user_name(),suser_sname() 

Doh! J'ai oublié d'échapper à mon code.

+0

Non, apparemment mon serveur SQL n'a pas entendu parler de l'une de ces commandes ... –

0

Il devrait être

select user name(),suser sname() 

remplacer les espaces par des underscores

+0

LOL comment embarrassant, qui répond également à ma question non écrite de ce qui est en place avec les italiques? Je ne suis pas sûr si ceux-ci vont fonctionner ou juste retourner le nom d'utilisateur que j'utilise pour connecter l'application Access à la base de données qui est la même pour tout le monde - est-il possible d'utiliser Active Directory dans le cadre du SQL processus d'authentification du serveur? De toute façon, je vais faire quelques tests pour m'assurer que c'est vraiment le cas. –

1

Si vous spécifiez SSPI dans votre chaîne de connexion à Sql, je pense que vos informations d'identification Windows sont fournis.

+0

Ya ces 2 commandes ont fait ce que je soupçonnais et juste retourné la même chose pour tout le monde. Je n'utilise pas de chaîne de connexion; Comme je l'ai dit plus tôt, j'utilise Access et je n'utilise que des tables liées pour me connecter à ma base de données. –

0

vous devez vous connecter avec sécurité intégrée aka voir connexion sécurisée (http://www.connectionstrings.com/?carrier=sqlserver)

+0

est-ce le seul moyen? Devrai-je changer le modèle entier des tables liées? Honnêtement, je ne sais même pas comment intégrer une chaîne de connexion dans Access ... –

1

J'ai essayé de jouer avec accès un peu pour voir si je pouvais trouver un moyen pour vous. Je pense que vous pouvez spécifier une nouvelle source de données à votre table SQL et sélectionnez l'authentification Windows NT comme type de connexion.

+0

Jay, pouvez-vous entrer dans un peu de détail sur COMMENT vous l'avez fait ... euh juste pour commencer je ne sais pas Je suis exactement toi. Cela fonctionnera quand même, j'ai encore besoin de m'authentifier avec le serveur SQL afin d'exécuter des requêtes. –

1

Bien sûr :)

Il devrait y avoir une section dans Access appelé « Données externes » (je suis en cours d'exécution d'une nouvelle version d'Access, donc le choix de menu peut être différent).

Formulaire ceci devrait être une option pour spécifier une connexion ODBC.

Je reçois une option pour lier à la source de données en créant une table liée. J'ai ensuite créé une source de données Machine. J'ai sélectionné SqlServer dans la liste déroulante. Ensuite, lorsque je clique sur Suivant, on me demande comment je veux m'authentifier.

1
CREATE TRIGGER testtrigger1 
ON testdatatable 
AFTER update 
AS 
BEGIN 
    INSERT INTO testtable (datecol,usercol1,usercol2) VALUES (getdate(),user_name(),suser_sname()); 
END 
GO 
2

Ok, ça marche ici. Je vois mes informations d'identification Windows lorsque je mets mes tables à jour. Donc, je parie que nous avons manqué un pas. Permettez-moi de mettre en place une séquence 1,2,3 de ce que j'ai fait et peut-être que nous pouvons traquer là où cela se brise pour vous.


  1. Créer une nouvelle base de données MSAccess (vide)
  2. Cliquez sur les tables section
  3. Sélectionner des données externes
  4. Pioche de base de données ODBC
  5. Pick Lien vers la source de données en créant une table liée
  6. Sélectionner la source de données machine
  7. Choisir Nouveau ...
  8. Source de données système
  9. Sélectionnez SQL Server dans la liste et cliquez sur Suivant, Terminer.
  10. Attribuez un nom et une description à la nouvelle source de données, puis sélectionnez (local) pour le serveur. Cliquez sur Suivant.
  11. Sélectionnez "Avec l'authentification Windows NT à l'aide de l'ID de connexion réseau". Cliquez sur Suivant.
  12. Cochez la case Remplacer la base de données par défaut et choisissez la base de données. Cliquez sur Suivant. Cliquez sur Terminer.
  13. Testez la source de données.
  14. Sélectionnez la table associée au déclencheur et cliquez sur OK.
  15. Ouvrez la table dans Access et modifier l'une des entrées (le déclencheur ne se déclenche pas sur Insérer, juste mise à jour)
  16. Sélectionnez * à partir de votre table d'audit
+0

Eh bien, apparemment, je suis un idiot parce qu'il semble fonctionner. Je voulais l'essayer sur un autre compte mais bien sûr, personne avec Access n'est encore là et je ne peux pas créer de nouveau compte. Ugh, de toute façon devrait fonctionner - avec les résultats finaux à afficher le lundi! Merci pour toute l'aide. –

1

Nous avons également un système de base de données qui est utilisé exclusivement dans l'organisation et utiliser les connexions Windows NT. Cette fonction renvoie le nom de connexion des utilisateurs actuels:

CREATE FUNCTION dbo.UserName() RETURNS varchar(50) 
AS 
    BEGIN 
    RETURN (SELECT nt_username FROM master.dbo.sysprocesses WHERE spid = @@SPID) 
    END 

Vous pouvez utiliser cette fonction dans vos déclencheurs.

0

Ma solution serait de ne pas laisser Access modifier les données avec des tables liées.

Je voudrais créer uniquement l'interface utilisateur dans Access et créer une connexion ADO au serveur à l'aide de fenêtres authentifiées dans la chaîne de connexion. Compilez-vous Accéder à l'application en tant que dbe pour protéger le code VB.

Je n'émettrais pas d'instruction SQL, mais j'appellerais des procédures stockées pour effectuer les modifications dans la base de données et créer l'entrée du journal d'audit dans une transaction atomique.

L'interface utilisateur (Access) n'a pas besoin de connaître les travaux internes sur le serveur. Tout ce qu'il doit faire est de demander et mettre à jour/insérer/supprimer en utilisant les procédures stockées que vous créez à cette fin. Le serveur devrait gérer le travail.

Récupérer un jeu d'enregistrements avec ADO à l'aide d'une vue avec l'indication NOLOCK implémentée dans le serveur et mettre en cache ces données dans Access pour l'affichage local. Ou récupérez un seul enregistrement et verrouillez uniquement cette ligne pour l'éditer. En utilisant des tables liées, vos utilisateurs se verrouillent mutuellement.

Avec les connexions ADO, vous n'aurez pas la peine de définir des ODBC sur chaque client.

Créer une table pour définir l'état du serveur. Votre application va le vérifier avant toute action. vous pouvez l'utiliser pour fermer le serveur à l'application dans le cas où vous avez besoin d'effectuer des modifications ou de la maintenance.

L'accès est un excellent outil. Mais il devrait seulement gérer ses données locales et ne pas être autorisé à jouer avec le précieux serveur.