我有一个奇怪的问题,我想创建一个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中可以正常工作,因此与数据库的连接应该可以正常工作。但为什么它不能用于创建触发器?
答案 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