Отбросить несколько процедур (SQL2005) - PullRequest
1 голос
/ 02 февраля 2010

Мне интересно, могу ли я отказаться от нескольких процедур, просто используя "%"? Как:

DROP constantName%

Когда я использую DROP в Management studio, это выглядит так:

/****** Object:  StoredProcedure [dbo].[x]    Script Date: 02/02/2010 09:36:25 ******/
IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[x]') AND type in (N'P', N'PC'))
DROP PROCEDURE [dbo].[x]

Почему он проверяет идентификатор объекта, когда я отбрасываю этот конкретный объект?

Ответы [ 3 ]

1 голос
/ 02 февраля 2010

Я боюсь, что вы не можете использовать подобный синтаксис в DROP, ниже простой строки, чтобы отбросить несколько процедур.

   DROP PROCEDURE testest,testest1 

И на ваш второй вопрос. Есть сценарии, в которых мы можем создать Storedprocedure, которая может быть доступна только для определенной роли.

create proc dbo.testest
as
begin
    select 1
end

запрос sys.objects со значением роли

select * from sys.objects where name ='dbo.testest'

возвращает ноль

   select * from sys.objects where name ='testest'

теперь работает

Представление каталога sys.objects хранит информацию без имен ролей (только имена). Но используя OBJECT_ID, мы можем получить информацию о конкретной роли

   select OBJECT_ID('dbo.testest') //works
   select OBJECT_ID('testest') //works

надеюсь, ты сможешь понять сейчас.

1 голос
/ 02 февраля 2010

Я думаю, что SQL был разработан с этим ограничением, команде drop drop нужна строковая константа. Вы также не можете передать переменную в качестве аргумента, она просто выдает ошибку «неправильный синтаксис», когда вы это делаете.

Также функция OBJECT_ID возвращает только действительный идентификатор объектов, которыми владеет пользователь или у которых есть разрешение. Таким образом, OBJECT_ID используется, потому что он выполняет проверку безопасности.

Удаление только с помощью "WHERE name = 'object_name'" также может работать, но только если у пользователя есть разрешение на этот объект.

1 голос
/ 02 февраля 2010

OBJECT_ID возвращает идентификационный номер объекта базы данных объекта в области схемы. В вашем коде он проверяет его внутри IF EXISTS, так что он будет УДАЛИТЬ только сохраненный процесс, если он присутствует в базе данных.

Вы могли бы просто иметь DROP PROCEDURE proc_name, но вы можете получить ошибку, если процедуры не существует. Это хорошая практика, чтобы проверить перед удалением.

Таблицы, View, Stored Procs и т. Д. Имеют идентификатор OBJECT_ID в качестве ключевого идентификатора.

Я не верю, что вы можете отбросить несколько хранимых процедур, используя LIKE. (Хотя я не уверен на 100%)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...