Создание динамического триггера - PullRequest
0 голосов
/ 25 мая 2009

Я использую MS SQL 2008 и хочу создать триггер в базе данных, которая создается динамически.

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

Если я попытаюсь запустить динамический SQL с

EXEC('USE dbase
GO
CREATE TRIGGER [blah]
GO')

Я получаю:

Неправильный синтаксис рядом с 'GO'

И если я уберу «ИСПОЛЬЗОВАТЬ ...», триггер будет создан в неправильной базе данных.

Есть ли хитрость, чтобы избежать моих проблем?

Thx

Ответы [ 3 ]

3 голосов
/ 25 мая 2009

«GO» не является языком T-SQL. Это ключевое слово, интерпретируемое такими инструментами клиента, как SSMS, как разделитель пакетов (что означает «отправлять текст на сервер»).

Теперь CREATE TRIGGER должен быть первым оператором в пакете, поэтому «USE dbname» не может использоваться.

Если вы упомянули «ИСПОЛЬЗОВАТЬ dbnname» перед EXEC, то это может произойти в базе данных по умолчанию для соединения. Вы должны проверить (я не могу сейчас, извините)

--Might work
USE dbase
EXEC ('CREATE TRIGGER [blah]
')

Или вам придется использовать sqlcmd или osql для подключения и запуска кода: это позволяет вам устанавливать контекст БД при подключении. Но не в T-SQL.

Или вы можете попробовать ALTER LOGIN xxx С DEFAULT_DATABASE = имя_базы перед EXEC

ALTER LOGIN xxx WITH DEFAULT_DATABASE = dbname 
--Now the EXEC will connect to default db if above approach fails
EXEC('CREATE TRIGGER [blah]
')
0 голосов
/ 24 сентября 2015

Чтобы создать ссылку только для проверки существования, а затем изменить с помощью alter.

IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[MiTrigger]') AND type in (N'TR'))
    EXEC ('CREATE TRIGGER [MiTrigger] ON [dbo].[MiTabla] FOR DELETE AS SET NOCOUNT ON')
GO
0 голосов
/ 25 мая 2009

Вы можете переключить базу данных перед вызовом exec и вернуться сразу после:

use newdb
exec ('CREATE TRIGGER [blah] ...')
use originaldb

Или создайте связанный сервер с нужной базой данных с RPC-кодом и:

EXEC ('CREATE TRIGGER [blah] ...') AT LinkedServerName

Или создайте другого пользователя с каталогом по умолчанию в базе данных, в котором вы хотите создать триггер, и:

EXECUTE AS LOGIN = 'UserName'
EXEC ('CREATE TRIGGER [blah] ...')
REVERT
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...