2011-06-21 6 views
0

データベースの論理部分を分離するためにスキーマを大量に使用する新しいデータベースを設計しています。いくつかのスキーマで複製されたテーブルの定義を制御する方法

例としては、従業員とクライアントがあります。それぞれにスキーマがあり、一方に接続するWebサービスは他方のWebサービスには許可されません。

ここで、問題が発生するのは、2つのスキーマ間でデータが非常によく似ているところです。たとえば、従業員とクライアントの両方に住所があります。

common.Addressのようなことができます。しかし、サービスデータアクセスを別々に保つという命令はかなり強力です。

従業員.Addressとclient.Addressと一緒に行くようです。

しかし、グローバルなアドレステーブル定義を強制する方法があればいいでしょう。開発中にこれら2つのアドレステーブルの定義が離れてしまうのを防ぐためのものです。 (注:実際には2つ以上になります)

SQL Serverには何かがありますか?別のスキーマに「インスタンス化」できる「タイプ」または「クラス」のテーブル。 (私はここに期待していないが、私は私が求めるだろうと思った。)というし、

+0

あなたは、この問題を解決しましたか? –

+0

@KM - 私たちが好きな解決策は見つかりませんでした。私たちは、彼らがドリフトしていれば、それだけであると言ってしまった。私たちは共通のDataContractを強制しようとしています。 – Vaccano

答えて

2

思考、ハード答えは...

我々は、

  • 共通データスキーマ
  • 見解を持っています共有コード

のクライアントあたりのスキーマ内の手続きオブジェクトなど

  • 内部「ヘルパー」スキーマは、この仕事はあなたのためでしょうか?

    私の他の考えは、クライアントごとのデータベースです。スキーマごと、特に直接DBアクセス、サポート、またはパワーユーザータイプの場合は、データベースごとのアクセス許可が容易です

  • 1

    あなたの最善の策はDDLトリガーです。あなたの "共通の"テーブル。以下のような

    何か:

    CREATE TRIGGER [Dont_Change_CommonTables] 
    ON DATABASE 
    FOR DDL_TABLE_EVENTS,GRANT_DATABASE 
    AS 
    DECLARE @EventData  xml 
    DECLARE @Message  varchar(1000) 
    SET @EventData=EVENTDATA() 
    
    IF (@EventData.value('(/EVENT_INSTANCE/ObjectType)[1]', 'varchar(50)')='TABLE' 
        AND @EventData.value('(/EVENT_INSTANCE/ObjectName)[1]', 'varchar(50)') IN ('Address' 
                           ,'etc...' 
                           --place your table list here 
                          ) 
        ) 
    BEGIN 
        ROLLBACK 
        SET @Message='Error! you can not make changes to '+ISNULL(LOWER(@EventData.value('(/EVENT_INSTANCE/ObjectType)[1]', 'varchar(50)')),'')+': '+ISNULL(@EventData.value('(/EVENT_INSTANCE/ObjectName)[1]', 'varchar(50)'),'') 
        RAISERROR(@Message,16,1) 
        RETURN 
    END 
    GO 
    
    関連する問題