Question:
I am new to mySQL and I donβt even know where to start. I want to know how to write a simple function that returns true or false based on the values ββthat are distributed in many tables.
Details:
Here are the relevant parts of my tables (all innodb
engines). When you start reading, you will see that the database simply stores users, groups, files and permissions for these files for these users / groups.
USER table :
CREATE TABLE IF NOT EXISTS USER ( ID INT NOT NULL auto_increment, PRIMARY KEY(ID) )
GROUP table:
CREATE TABLE IF NOT EXISTS GROUP ( ID INT NOT NULL AUTO_INCREMENT, PRIMARY KEY(ID) )
Group members table:
CREATE TABLE IF NOT EXISTS GROUPMEMBERSHIP ( ID INT NOT NULL AUTO_INCREMENT, USERID INT NOT NULL, GROUPID INT NOT NULL, UNIQUE ( USERID, GROUPID ), PRIMARY KEY(ID), FOREIGN KEY (USERID) REFERENCES USER(ID), FOREIGN KEY (GROUPID) REFERENCES GROUP(ID) )
FILE table: (R, W, X, for other
)
CREATE TABLE IF NOT EXISTS FILE ( ID INT NOT NULL AUTO_INCREMENT, READ BOOLEAN DEFAULT FALSE, WRITE BOOLEAN DEFAULT FALSE, EXECUTE BOOLEAN DEFAULT FALSE, PRIMARY KEY(ID) )
USER PERMISSION TABLE:
CREATE TABLE IF NOT EXISTS FILEUSERPERMISSIONS ( ID INT NOT NULL AUTO_INCREMENT, FILEID INT NOT NULL, USERID INT NOT NULL, READ BOOLEAN DEFAULT FALSE, WRITE BOOLEAN DEFAULT FALSE, EXECUTE BOOLEAN DEFAULT FALSE, UNIQUE (FILEID, USERID), PRIMARY KEY(ID), FOREIGN KEY (FILEID) REFERENCES FILE(ID), FOREIGN KEY (USERID) REFERENCES USER(ID) )
FILE GROUP PERMISSION TABLE:
CREATE TABLE IF NOT EXISTS FILEGROUPPERMISSIONS ( ID INT NOT NULL AUTO_INCREMENT, FILEID INT NOT NULL, GROUPID INT NOT NULL, READ BOOLEAN DEFAULT FALSE, WRITE BOOLEAN DEFAULT FALSE, EXECUTE BOOLEAN DEFAULT FALSE, UNIQUE (FILEID, GROUPID), PRIMARY KEY(ID), FOREIGN KEY (FILEID) REFERENCES FILE(ID), FOREIGN KEY (GROUPID) REFERENCES GROUP(ID) )
hasPermission:
DELIMITER $$ DROP FUNCTION IF EXISTS hasPermission$$ CREATE FUNCTION hasPermission(fileID INT, userID INT) RETURNS BOOLEAN BEGIN ??? END$$ DELIMITER ;
How would I go, or at least where to start writing the hasPermission
function hasPermission
that when prompted like this:
SELECT hasPermission( 123, 456)
It does the following:
- Checks if file 123 is readable by
other
- Checks if user 456 has read permissions on file 123
- Checks if user 456 is in any group that has read permissions in file 123
The first of these is the trivial of the three. The second - I'm at a standstill. The third is a conceptual barrier for me. In addition to all this, I obviously have to check if the user and / or the file exists.
Please be kind because I am new to MySQL.
Thanks in advanced