从VS2010中的sql文件创建触发器?

时间:2012-02-15 10:22:43

标签: sql visual-studio-2010 sql-server-2008 triggers

我有一个奇怪的问题,我想创建一个emtpy触发器:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE TRIGGER dbo.TestTrigger 
   ON  _TestDB.dbo.test
   AFTER UPDATE
AS 
BEGIN
    SET NOCOUNT ON;
END
GO

如果我在SSMS中执行它,它可以正常工作,但如果我在Visual Studio中创建一个新的SQL文件并单击“执行SQL”,那么我只是收到一条错误消息:

  

Msg 2108,Level 15,State 1,Procedure TestTrigger,Line 13 Erstellen   Trigger kannnichtfür'_TestDB.dbo.test'ausgeführtwerden,da sich   das Ziel nicht in der aktuellen Datenbank befindet。

翻译:

  

消息2108,级别15,状态1,过程TestTrigger,第13行创建   无法为'_TestDB.dbo.test'执行触发器,因为   目标在当前数据库中不存在。

SSMS和VS2010都连接到与同一用户相同的数据库服务器。

简单的Select * From _TestDB.dbo.test在Visual Studio中可以正常工作,因此与数据库的连接应该可以正常工作。但为什么它不能用于创建触发器?

1 个答案:

答案 0 :(得分:3)

如错误所示,必须在与基础目标表相同的数据库中创建触发器。

因此,请确保在与dbo.test表相同的数据库(_TestDB)中创建触发器

USE _TestDB
GO

SET ANSI_NULLS ON GO 
SET QUOTED_IDENTIFIER ON 
GO  

CREATE TRIGGER dbo.TestTrigger     
ON  dbo.test    
AFTER UPDATE AS  
BEGIN     
  SET NOCOUNT ON; 
END 
GO 

编辑:只是为了澄清 - 连接是在服务器实例级别,而不是在数据库级别。通过将表限定为_TestDB.dbo.test,即使当前数据库(目录)当前指向其他数据库,您也可以访问该表。

编辑:OIC - 是的,这意味着您当前的数据库不是“_TestDB”。您还发现SQL的DDL执行不一致。大多数DDL命令可以从远程数据库(包括CREATE INDEX)成功执行,但由于某种原因,不是触发器。以下重点介绍了不一致性(SQL 2008 Express)

use master
go

CREATE DATABASE bob
GO

-- DB_NAME() = master
CREATE TABLE bob.dbo.SomeTable
(
    SomeTableId INT NOT NULL,
    AnotherField VARCHAR(50) NULL
)
GO -- Success

-- DB_NAME() = master
CREATE INDEX IX1_SomeTable on bob.dbo.SomeTable(SomeTableId)
GO -- Success. Note that the index is actually created in bob, not master of course

-- DB_NAME() = master
ALTER TABLE bob.dbo.SomeTable ADD CONSTRAINT PK_SomeTableId PRIMARY KEY(SomeTableId)
GO -- Success

-- DB_NAME() = master
CREATE TRIGGER bob.dbo.SomeTableTrigger -- 'CREATE/ALTER TRIGGER' does not allow specifying the database name as a prefix to the object name.
    ON  bob.dbo.SomeTable
    AFTER UPDATE
AS
    BEGIN
        PRINT 'Trigger called'
    END
GO

-- DB_NAME() = master - this is your scenario - 
CREATE TRIGGER dbo.SomeTableTrigger -- Cannot create trigger on 'bob.dbo.SomeTable' as the target is not in the current database.
    ON  bob.dbo.SomeTable
    AFTER UPDATE
AS
    BEGIN
        PRINT 'Trigger called'
    END
GO

USE BOB
GO

-- DB_NAME() = bob
CREATE TRIGGER dbo.SomeTableTrigger -- Success
    ON  bob.dbo.SomeTable
    AFTER UPDATE
AS
    BEGIN
        PRINT 'Trigger called'
    END
GO