4

したがって、基本的に私は会社用のアプリを構築しています.MS Accessを使用して構築する必要があり、SQL Serverで構築する必要があります.

私はほとんどの計画を作成しましたが、監査システムを処理する方法を理解するのに苦労しています.

内部でのみ使用されており、建物の外からデータベースにアクセスすることさえできないため、ユーザーが Active 経由で内部ネットワークにログインした後にのみプログラムが使用されるため、ログイン システムは使用していません。ディレクトリ。これを認識して、システムを使用して Active Directory ユーザーの名前を自動的に検出し、DB テーブルの 1 つのアクセス許可を使用して、ユーザーができることとできないことを決定します。

したがって、実際の監査テーブルには 3 つの列があります (この設計は変更される可能性がありますが、この質問では問題になりません)。誰が(Active Directoryユーザー)、いつ(追加・削除・編集時)、何を(何を変更したか)

私の質問は、これをどのように処理する必要があるかです。理想的には、トリガーを使用して、監査がログに記録されずにデータベースが更新されないようにする必要があることを知っていますが、その方法で Active Directory ユーザーを取得する方法がわかりません。別の方法として、Access ソースに直接コーディングして、何かが変更されるたびに INSERT ステートメントを実行することもできます。Access に何かが起こった場合、またはデータベースが他の何かに触れられた場合、監査がログに記録されないため、明らかに欠陥があります。

私を助けるかもしれないアドバイス、例、または記事は大歓迎です!

4

11 に答える 11

2

わかりました、ここで機能しています。テーブルを更新すると、Windows 資格情報が表示されます。だから、私たちは一歩を逃したに違いない。私が行ったことの 1、2、3 シーケンスをまとめさせてください。


  1. 新しい MSAccess データベースを作成します (空)
  2. 表セクションをクリックします
  3. 外部データを選択
  4. ODBC データベースを選択
  5. リンクされたテーブルを作成して、データソースへのリンクを選択します
  6. マシンのデータソースを選択
  7. 新規を選択...
  8. システム データソース
  9. リストから SQL Server を選択し、[次へ]、[完了] の順にクリックします。
  10. 新しいデータソースに名前と説明を付け、サーバーに (ローカル) を選択します。[次へ] をクリックします。
  11. 「ネットワーク ログイン ID を使用した Windows NT 認証あり」を選択します。[次へ] をクリックします。
  12. Change the default database to にチェックを入れ、DB を選択します。[次へ] をクリックします。[完了] をクリックします。
  13. データソースをテストします。
  14. トリガーが関連付けられているテーブルを選択し、[OK] をクリックします。
  15. Access でテーブルを開き、エントリの 1 つを変更します (トリガーは Insert では起動せず、Update のみで起動します)。
  16. 監査テーブルから * を選択します
于 2008-08-15T20:52:27.900 に答える
2

これはうまくいきますか?


select user_name(),suser_sname()

どっ!コードをエスケープするのを忘れました。

于 2008-08-15T19:44:23.013 に答える
1

Sql への接続文字列に SSPI を指定すると、Windows 資格情報が提供されると思います。

于 2008-08-15T19:53:32.167 に答える
1

Access でちょっと遊んでみました。SQL テーブルに新しいデータソースを指定し、接続の種類として Windows NT 認証を選択できると思います。

于 2008-08-15T20:07:23.950 に答える
1

もちろん :)

Access には「外部データ」というセクションがあるはずです (新しいバージョンの Access を実行しているため、メニューの選択が異なる場合があります)。

このフォームには、ODBC 接続を指定するオプションが必要です。

リンク テーブルを作成して、データ ソースにリンクするオプションが表示されます。

次に、Machine データソースを作成しました。ドロップダウン リストから SqlServer を選択しました。次に [次へ] をクリックすると、認証方法を尋ねられます。

于 2008-08-15T20:14:30.097 に答える
1
CREATE TRIGGER testtrigger1
ON testdatatable
AFTER update
AS 
BEGIN
    INSERT INTO testtable (datecol,usercol1,usercol2) VALUES (getdate(),user_name(),suser_sname());
END
GO
于 2008-08-15T20:46:22.840 に答える
1

また、組織内でのみ使用され、Windows NT ログインを使用するデータベース システムもあります。この関数は、現在のユーザーのログイン名を返します。

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

この関数はトリガーで使用できます。

于 2008-09-15T23:24:36.363 に答える
0

My solution would be not to let Access modify the data with linked tables.

I would only create the UI in Access and create an ADO connection to the server using windows authenticated in the connection string. Compile you Access application as dbe to protect the VB code.

I would not issue SQL statement, but I would call stored procedures to perform the changes in the database, and create the audit log entry in an atomic transaction.

The UI (Access) does not need to know the inner works on the server. All it needs to do is request and update/insert/delete using the stored procedures you would create for this purpose. The server should handle the work.

Retrieve a record set with ADO using a view with the hint NOLOCK implemented in the server and cache this data in Access for local display. Or retrieve a single record and lock only that row for editing.

Using linked tables your users will be locking each other.

With ADO connections you will not have the trouble to set ODBCs on every single client.

Create a table to set the server status. You application will check it before any action. you can use it to close the server to the application in case that you need to perform changes or maintenance.

Access is a great tool. But it should only handle its local data and not be allowed to mess with the precious server.

于 2008-09-16T03:02:04.530 に答える
0

アプリのユーザー数は?SQL 認証に Windows 統合認証を使用する可能性はありますか?

更新: 各ユーザーに SQL ログイン (Windows 統合) を付与できる場合は、SYSTEM_USER 関数を使用して、ログオンしているユーザーを取得できます。

于 2008-08-15T19:40:43.787 に答える
0

そのはず

select user name(),suser sname()

スペースをアンダースコアに置き換える

于 2008-08-15T19:49:23.300 に答える
0

統合セキュリティ、別名信頼できる接続に接続する必要があります ( http://www.connectionstrings.com/?carrier=sqlserverを参照)

于 2008-08-15T20:02:55.533 に答える