11

共通のスキーマでいくつかのデータを共有する 2 つのアプリケーションを構築しています。MySQL を RDBMS として使用しています。これが私の最初のスキーマです(test_schema_1):

test_schema_1

そして 2 番目 ( test_schema_2):

test_schema_2

最近、複数のスキーマ間で JOIN を実行できることを知りました。root ユーザー (すべてに無制限にアクセスできる) に接続している場合は、次のようにします。

SELECT * FROM
TEST_SCHEMA_2.USERS U
JOIN TEST_SCHEMA_1.MASTER_USERS MU ON U.MASTER_ID = MU.ID
JOIN TEST_SCHEMA_2.ROLES R ON U.ROLE_ID = R.ID
WHERE MU.APP_ID = 'darth_vader@death.star';

そして、私が期待するものを手に入れましょう!私はこのデザインで生産に行くことを考えているので、これは私にとって非常にクールに見えます.

しかし、そのような設計のパフォーマンスへの影響を少し恐れていますか? これは良い考えですか?将来、別のマシンでデータベースを (MongoDB 用語で) 分割することにした場合はどうなりますか?

また、セキュリティの問題も気になります。現在、スキーマごとに個別のユーザーがいます。

Host        Db              User    Select_priv Insert_priv Update_priv Delete_priv Create_priv Drop_priv   Grant_priv  References_priv Index_priv  Alter_priv  Create_tmp_table_priv   Lock_tables_priv    Create_view_priv    Show_view_priv  Create_routine_priv Alter_routine_priv  Execute_priv    Event_priv  Trigger_priv
%           test_schema_1   t1      Y           Y           Y           Y           N           N           N           N               N           N           N                       N                   N                   N               N                   N                   N               N           Y
localhost   test_schema_1   t1      Y           Y           Y           Y           N           N           N           N               N           N           N                       N                   N                   N               N                   N                   N               N           Y
%           test_schema_2   t2      Y           Y           Y           Y           N           N           N           N               N           N           N                       N                   N                   N               N                   N                   N               N           Y
localhost   test_schema_2   t2      Y           Y           Y           Y           N           N           N           N               N           N           N                       N                   N                   N               N                   N                   N               N           Y

したがって、ユーザーt1はから読み取ることができないと思いますtest_schema_2。しかし、上記のクエリは機能します。彼は挿入することさえできますtest_schema_2

SELECT USER();
INSERT INTO TEST_SCHEMA_2.ROLES(ID, NAME) VALUES(4, 'TEST');
...
USER()
t1@localhost
-------------------------------------------
Updated Rows
1

私は何が欠けていますか?

4

2 に答える 2

1

まず、セキュリティ設定を調整する必要があります。おそらく、ユーザーはすべてのスキーマへのアクセスを許可しています。簡単にするために、次の呼び出しを試してください。

REVOKE ALL PRIVILEGES, GRANT OPTION from 't1','t2'; 
GRANT SELECT, INSERT, UPDATE, DELETE ON `test\_schema\_1`.* TO 't1';
GRANT SELECT, INSERT, UPDATE, DELETE ON `test\_schema\_2`.* TO 't2';
FLUSH PRIVILEGES;

2 番目の部分は、スキーマに関するものです。基本的に、これは異なるスキーマを照会する問題ではありません。セキュリティの問題について混乱している場合は、クエリをプロシージャに切り替えることをお勧めします。また、シャーディングのおかげで、さまざまなスキーマを分割するのがさらに簡単になります。

于 2013-11-18T08:18:52.850 に答える