2016-09-07 3 views
0

教師の一つは、私たちに次のような課題ました:これはSQLではどのようなアプローチですか、実際には存在しますか?それは実行可能な/良いpraticeですか?

「を以下の原理を使用したデータベースのスキーマを作成します。 あなたが任意のテーブルの任意の値を変更することはできません、だけで新しいものを追加します。」

私は、次のスキーマに付属している:

CREATE TABLE TRANSACTIONS(ID PRIMARY KEY, TRANSACTION_TYPE_FK, DATE); 

    CREATE TABLE TRANSACTION_TYPE(ID PRIMARY KEY, NAME); 

    CREATE TABLE PRODUCTS_TRANSACTIONS(ID_PROD_FK, ID_TRANS_FK, MONEY, QTY); 

    CREATE TABLE PRODUCTS(ID PRIMARY KEY, NAME, PRICE_FK); 

    CREATE TABLE PRICES(ID PRIMARY KEY, DATE, DETAILS); 

それは概念だけの証拠です。基本的にはすべてがトランザクションに基づいています。

取引は、入金、出金、移動商品、および&出金とすることができます。

私はトランザクションに基づいて自分の数量と現金を管理することができます。

PRODUCTS_TRANSACTIONS "MONEY"フィールドは、取引に金額のみが含まれている場合、または取引に「割引」または「税金」がある場合に使用されます。

製品表は、「価格」と呼ばれる「子」テーブルを持っている、それはすべての価格変化をストレージ、「詳細」の欄には「費用価格」などの注釈のためであるなど

私はそれが非常に迅速に行われ、矛盾して申し訳ありません。

私はこのようなアプローチが好きでした。私はSQLを初心者にしています。このアプローチに名前が付いていて、それが実行可能かどうか、または実行可能かどうかを知りたかったのです。

新しいトランザクションが作成されるたびに、ビューを作成して「更新」することは、ビューに新しい行を追加するだけで済みます。

私は現在非常に気分が悪いので、私は疑いを是正するために大学に行くことができません。任意のヘルプ

+0

「値を変更するために更新コマンドを使用できません」という意味は分かりませんが、履歴を保持する場合は、テーブルにトリガーを作成して古い/更新されたデータを別のテーブルに保存できます。 –

+0

"あなたはどのテーブルのどの値も変更することはできません。追加するだけです。変更を削除して再計算する" – LouizFC

+0

どのDBMS(ベンダーとバージョン)ですか? 'TRIGGERの代わりに'を読んでいるかもしれません。 ** DBMSが何かをやる前にあなたの行動を** **置くことができます。現在の行の 'ValidTo'日付を設定し、更新*の代わりに新しい値*を挿入するか(古い値を履歴テーブルにプッシュする) – Shnugo

答えて

1

のは、例えば一つだけのテーブルTRANSACTION_TYPE(ID PRIMARY KEY、NAME)を見てみましょう:今すぐ

あなたがテーブルの上に更新を制限したい場合は、次のクエリでそれを達成することができます

GRANT SELECT,INSERT,DELETE ON TRANSACTION_TYPE TO Username; 
         OR 
Deny UPDATE ON TRANSACTION_TYPE TO Username; 

さて、挿入や削除の履歴を維持するために、次のようにあなたはTRANSACTION_TYPEにトリガーを作成することによって、別のテーブルに格納することができます:

CREATE or REPLACE TRIGGER my_trigger // name of trigger 
AFTER INSERT OR DELETE 
ON TRANSACTION_TYPE 
FOR EACH ROW 
BEGIN 
IF INSERTING THEN 
INSERT INTO TRANSACTION_INSERT_HISTORY(ID,NAME) //table that maintain history of insertion 
VALUES(:new.ID,:new.NAME);  
ELSIF DELETING THEN 
INSERT INTO TRANSACTION_DELETE_HISTORY(ID,NAME) //table that maintain history of deleted records 
VALUES(:old.ID,:old.NAME); 
END IF; 
END; 
/

このTRを作成する前に私は簡単にするために挿入や削除のための2つの異なるテーブルを作成しました TRANSACTION_INSERT_HISTORY(ID、NAME)と TRANSACTION_DELETE_HISTORY(ID、NAME)

:iggerは、あなたが最初の2つのテーブルを作成する必要があります。 1つのテーブルでも実行できます。

希望します。

0

情報を保持するテーブルを事前に

おかげで、あなただけの挿入や更新を防止、テーブルに選択する権限を与えることができます。

https://www.mssqltips.com/sqlservertip/1138/giving-and-removing-permissions-in-sql-server/

GRANTのINSERT、生産システムでは

をUserY TO TABLEX ON SELECT、あなたはおそらく唯一の最新のリビジョンを取得する(テーブルからデータを選択するためのVIEWを使用して、これを設計したいです監査データの内容)。すべての監査履歴を表示するための別のVIEWを使用します。おそらく、データを挿入し、データが監査履歴で維持されていることを確認するために、ストアドプロシージャを使用することもできます。

関連する問題