我已经在互联网上寻找解决方案(主要是扫描堆栈溢出)并且我无法想出任何东西。
这是我的目标:我有一个本地数据库,我已经建立了一个到另一个数据库的链接服务器。我正在我的一个本地表上创建一个触发器。其中一个列值是酒店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
答案 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