1

私はかなりデータベースの初心者です:-(私がそのように設計された単純なテーブルを持っている場合:

CREATE TABLE IF NOT EXISTS picture
(
ID INT NOT NULL AUTO_INCREMENT,
userID INT NOT NULL,
name VARCHAR(150),

PRIMARY KEY(ID),
FOREIGN KEY (userID) REFERENCES user(ID)
)ENGINE=InnoDB

たとえば、次のように説明します。

+----+--------+------+
| ID | userID | name |
+----+--------+------+
|  1 |      1 | john |
|  2 |      1 | jack |
|  3 |      2 | amir |
|  4 |      2 | chan |
|  5 |      2 | jose |
|  6 |      3 | jane |
|  7 |      3 | buba |
+----+--------+------+

次の2つの制約を満たすデータベースをどのように設計しますか。

  1. ユーザー12およびテーブル3に新しいエントリを追加できpicturesます。
  2. ユーザー12およびをそれぞれ持つ行のみ3を変更できます。userID123

これは些細なことではないかもしれませんので、追加の質問があれば遠慮なく質問してください。それに応じてこの質問を編集します。

4

2 に答える 2

2

この答えから引き出して、私はこれをまとめました:

delimiter //
CREATE TRIGGER trig_picture BEFORE UPDATE ON picture
FOR EACH ROW
BEGIN
    DECLARE dummy INT;
    IF NOT EXISTS (select ID from users where ID = OLD.userID and name = (SELECT SUBSTRING_INDEX(USER(), '@', 1))) THEN
        SET NEW=(SELECT CONCAT("Access Denied for user ", SUBSTRING_INDEX(USER(), '@', 1), "; uid ", OLD.userID));
    END IF;
END;//
delimiter ;

usersこれは、いくつかのエントリを含むテーブルがあることを前提としています。

CREATE TABLE IF NOT EXISTS users ( ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(150) );
insert into users values (1, 'adam');
insert into users values (2, 'bob');
insert into users values (3, 'clark');

usersこれは、テーブル内の名前が、によって返されるデータベースユーザー名と一致することを前提としていますSELECT SUBSTRING_INDEX(USER(), '@', 1)

また、これは更新の発生を防ぐだけであることに注意してください。エントリの作成/削除を防ぐために、追加の挿入/削除トリガーも作成する必要があります。

最後に、これは誰かが写真テーブルのエントリのユーザーIDを変更することを妨げず、本質的にそれ以上の編集からそれらをロックアウトします。これが重要な場合は、そのトリガーにチェックを追加できます。

于 2012-04-19T21:55:10.910 に答える
1

最初の項目については、ユーザー1、2、および3のpicturesテーブルにINSERT権限を付与するだけで済みます。

2番目の項目については、次のようにすることができます。

A. userIDとデータベースログインの間のマッピングを含む追加のテーブル(db_logins)を作成します。

+----+--------+--------------+
| ID | userID | db_loginname |
+----+--------+--------------+
|  1 |      1 | dbLogin1     |
|  2 |      2 | dbLogin2     |
|  3 |      3 | dbLogin3     |
+----+--------+--------------+

B.更新を行うときはいつでも、db_loginnameのチェックをWHERE句に追加してください。UPDATEステートメントは次のようになります(現時点ではMySQLインスタンスにアクセスできないため、構文を確認できません)。

UPDATE pictures
SET name = 'new name'
FROM pictures
INNER JOIN db_logins 
    ON pictures.userID = db_logins.userID
WHERE name = 'buba' 
   AND db_loginname = user()
于 2012-04-16T05:51:00.507 に答える