Use a column name to specify a predefined table

Course Queries Syllabus Queries 2 years ago

0 2 0 0 0 tuteeHUB earn credit +10 pts

5 Star Rating 1 Rating

Posted on 16 Aug 2022, this text provides information on Syllabus Queries related to Course Queries. Please note that while accuracy is prioritized, the data presented might not be entirely correct or up-to-date. This information is offered for general knowledge and informational purposes only, and should not be considered as a substitute for professional advice.

Take Quiz To Earn Credits!

Turn Your Knowledge into Earnings.

tuteehub_quiz

Answers (2)

Post Answer
profilepic.png
manpreet Tuteehub forum best answer Best Answer 2 years ago


I'm trying to use set up a database for a school project, and I'm using triggers to set up referential integrity for one table. I have a table, Addresses, which stores the address for People, Studios, and Directors. Then I have a table called Address Reference. This table points to the Address table, and it has a two fields, the ReferenceID and the TableName to show which table and row this address is for. I have a Constraint so TableName will always be valid.

I'm trying to set up a trigger to make sure any rows">rows inserted are valid, which I can do, I'm just trying to improve it. My code would look like this:

SELECT * 
    FROM inserted 
        WHERE ReferenceID IN 
            (SELECT PersonID 
                FROM inserted.TableName)

However I found I needed to use dynamic sql. So I was thinking something like this:

SELECT * 
    FROM inserted 
        WHERE ReferenceID IN 
            (EXEC('SELECT PersonID FROM' + inserted.TableName))

Which didn't work, even when I removed the exec.

I'm doing this in SQL Server Management Studio With SQL Server 11.0.3128

Let me know if you need any more information. I've looked around, and I haven't found any answers to this question that work.

profilepic.png
manpreet 2 years ago

This is a poor way to maintain referential integrity. There are a number of ways you could approach this.

The first would be to have an address table, then multiple tables to contain the links, e.g.

CREATE TABLE StudioAddress
(       StudioID INT NOT NULL,
        AddressID INT NOT NULL,
    CONSTRAINT PK_StudioAddress__StudioID_AddressID PRIMARY KEY (StudioID, AddressID),
    CONSTRAINT FK_StudioAddress__StudioID FOREIGN KEY (StudioID) REFERENCES Studio (StudioID),
    CONSTRAINT FK_StudioAddress__AddressID FOREIGN KEY (AddressID) REFERENCES Address (AddressID)
);

This maintains your referenctial integrity without needing triggers, and still caters for a 1 to many relationship.

Another option would be to have 3 nullable columns in your address table (StudioID, PersonID, DirectorID), each with a foreign key to the relevant table, you can the add a check constraint to ensure only one of the 3 fields is populated (if this is required).

I much prefer the first option though, it is much cleaner, and also allows for the same address to be used for multiple things.


ADENDUM

If this has to be done using triggers, then I think you would need to use something like this:

IF EXISTS(  SELECT  1
            FROM    inserted i
            WHERE   NOT EXISTS
                    (   SELECT  1
                        FROM    People p
                        WHERE   p.PersonID = i.ReferenceID
                        AND     i.TableName = 'People'
                        UNION ALL
                        SELECT  1
                        FROM    Studios s
                        WHERE   s.StudioID = i.ReferenceID
                        AND     i.TableName = 'Studios'
                        UNION ALL
                        SELECT  1
                        FROM    Directors d
                        WHERE   d.DirectorID = i.ReferenceID
                        AND     i.TableName = 'Directors'
                    )
        )
        BEGIN
            ROLLBACK TRANSACTION;
            RAISERROR('Referential integrity error', 16, 1);
        END

This essentially checks that for all inserted/updated rows a record exists with the relevant ID in the relevant table.

I still stand by my earlier answer though, that this is a terrible approach, and I would question any syllabus this is on!


0 views   0 shares

No matter what stage you're at in your education or career, TuteeHub will help you reach the next level that you're aiming for. Simply,Choose a subject/topic and get started in self-paced practice sessions to improve your knowledge and scores.