Sql 使用触发器在两个不同的服务器上充当外键
我正在尝试使用触发器跨两台服务器复制外键。我知道跨2台服务器使用触发器不是最佳做法,但我的公司在上为我提供了对其数据库的只读访问权限,我需要将其与我的应用程序关联 我有DB1,这是我的本地数据库,它使用链接服务器连接到DB2。我希望触发器在对DB1_表执行INSERT之前检查DB2上DB2_表的特定ID是否存在,其中DB2_表的ID将用作外键Sql 使用触发器在两个不同的服务器上充当外键,sql,sql-server,Sql,Sql Server,我正在尝试使用触发器跨两台服务器复制外键。我知道跨2台服务器使用触发器不是最佳做法,但我的公司在上为我提供了对其数据库的只读访问权限,我需要将其与我的应用程序关联 我有DB1,这是我的本地数据库,它使用链接服务器连接到DB2。我希望触发器在对DB1_表执行INSERT之前检查DB2上DB2_表的特定ID是否存在,其中DB2_表的ID将用作外键 CREATE TRIGGER trigger_DB1_Table_Insert @ID BEFORE INSERT ON DB1_Table AS
CREATE TRIGGER trigger_DB1_Table_Insert
@ID
BEFORE INSERT ON DB1_Table
AS
BEGIN
if exists(Select ID from DB2_Table where ID = @ID)
--execute insert
END
GO
实际上,我建议使用检查约束而不是触发器。检查约束旨在加强数据完整性,是语义上更好的选择。下面的示例创建一些工作表,然后创建一个函数,该函数将检查另一个表中是否存在该记录 然后,check约束使用该函数,如果该值不存在,则返回一个错误
CREATE TABLE dbo.OtherTable(
id INT
)
CREATE TABLE dbo.a(
id INT IDENTITY(1,1)
,OtherTableId INT
)
GO
INSERT INTO OtherTable (id) VALUES (1), (2), (3)
GO
-- Function will check if the ID exists in the other table
CREATE FUNCTION dbo.CheckOtherTableId(
@OtherTableId INT
)
RETURNS BIT
AS BEGIN
RETURN
(
SELECT
CASE
WHEN EXISTS
(
SELECT 1
FROM OtherTable
WHERE id = @OtherTableId
)
THEN 1
ELSE 0
END
)
END
GO
-- Add check constraint
ALTER TABLE a WITH CHECK
ADD CONSTRAINT [CK_OtherTable] CHECK (1=dbo.CheckOtherTableId(OtherTableId))
GO
-- Test should work
INSERT INTO a (OtherTableId) values (1)
Go
-- Test should fail
INSERT INTO a (OtherTableId) values (8)
GO