Создать триггер из файла sql в VS2010? - PullRequest
1 голос
/ 15 февраля 2012

У меня здесь странная проблема, я хочу создать 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, оно работает отлично, но если я создаю новый файл SQL в Visual Studio и нажимаю «Выполнить SQL», то я просто получаю сообщение об ошибке:

Сообщение 2108, уровень 15, состояние 1, процедура TestTrigger, строка 13 Эрстеллен Триггер kann nicht für '_TestDB.dbo.test' ausgeführt werden, 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, поэтому подключение к базе данных должно работать. Но почему это не работает для Create Trigger?

1 Ответ

3 голосов
/ 15 февраля 2012

Как следует из ошибки, триггеры должны быть созданы в той же базе данных, что и базовая таблица назначения.

Поэтому убедитесь, что вы создали триггер в той же БД (_TestDB), что и ваша таблица dbo.test

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".Вы также обнаружили несоответствие в выполнении DDL SQL.Большинство команд 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
...