Sql 使用触发器在两个不同的服务器上充当外键

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

我正在尝试使用触发器跨两台服务器复制外键。我知道跨2台服务器使用触发器不是最佳做法,但我的公司在上为我提供了对其数据库的只读访问权限,我需要将其与我的应用程序关联

我有DB1,这是我的本地数据库,它使用链接服务器连接到DB2。我希望触发器在对DB1_表执行INSERT之前检查DB2上DB2_表的特定ID是否存在,其中DB2_表的ID将用作外键

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