使用Trigger保持数据完整性

时间:2014-08-03 07:52:59

标签: sql sql-server triggers linked-server

我已经在互联网上寻找解决方案(主要是扫描堆栈溢出)并且我无法想出任何东西。

这是我的目标:我有一个本地数据库,我已经建立了一个到另一个数据库的链接服务器。我正在我的一个本地表上创建一个触发器。其中一个列值是酒店ID。在链接服务器中有一个名为“Hotel”的表。此触发器的目的是检查并确保我尝试插入到本地表中的HotelID是链接服务器的Hotel表中存在的值。

示例:如果我想从本地向我的“Store Table”插入一个新行,我想确保我尝试插入的HotelID存在于我的链接服务器的“Hotel”表中。如果它不存在,我想回滚事务并显示一条消息。

以下是我一直在玩的代码。我觉得我可以亲近,但我对这个想法非常开心。

仅供参考:IF NOT EXISTS语句中的代码不正确。我只是对那里需要去的东西感到困惑。

CREATE TRIGGER tr_trigger ON Store
AFTER Insert
AS
DECLARE @HotelID smallint = (SELECT HotelID FROM inserted)

DECLARE @query NVARCHAR(MAX) = N'SELECT   * FROM OPENQUERY (test,''               
SELECT HotelID FROM test.dbo.Hotel WHERE HotelID = ''''' +   
CONVERT(nvarchar(15),@HotelID) +''''''')'
DECLARE @StoredResult Nvarchar(20)
BEGIN
EXEC sp_executesql @query, N'@StoredResult NVARCHAR(MAX) OUTPUT', @StoredResult =  
@StoredResult OUTPUT
SELECT @StoredResult

IF NOT EXISTS (SELECT * FROM OPENQUERY (test,' SELECT HotelID FROM test.dbo.Hotel'))
BEGIN
    PRINT'That HotelID does not exist. Please try again.'

    ROLLBACK TRANSACTION
END

END
GO

编辑:由于marc_s的一些建议,这已经解决了。下面是我的新代码,它可以满足我的需要。

CREATE TRIGGER tr_trigger ON Store
AFTER Update, Insert
AS
BEGIN
    IF NOT EXISTS (SELECT A.* FROM OPENQUERY (test, 'SELECT HotelID  FROM test.dbo.hotel') A
        INNER JOIN inserted i
        ON A.HotelID = i.HotelID)
    BEGIN
        PRINT'Please enter a valid HotelID'     
        ROLLBACK TRANSACTION
    END 
END
GO

1 个答案:

答案 0 :(得分:1)

怎么样:

CREATE TRIGGER tr_DataIntegrity ON Store
AFTER Update, Insert
AS
BEGIN
    IF EXISTS (
        SELECT * FROM inserted i 
        WHERE NOT EXISTS (
               SELECT A.*
               FROM OPENQUERY (TITAN_Prescott_Store, 'SELECT HotelID  FROM FARMS_Prescott.dbo.hotel') A
                WHERE A.HotelID = i.HotelID))
         BEGIN
             PRINT'Please do not enter an invalid HotelID'     
             ROLLBACK TRANSACTION
         END 
END
GO
相关问题