我很好奇我是否可以通过简单地使用“%”来删除多个程序? 像:
DROP constantName%
当我在Management studio中使用DROP时,它看起来像是:
/****** 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]
为什么在删除此特定对象时检查对象ID?
答案 0 :(得分:1)
OBJECT_ID返回架构范围对象的数据库对象标识号。在你的代码中,它在IF EXISTS内部进行检查,因此只有在数据库中存在时才会删除存储过程。
您可以拥有DROP PROCEDURE proc_name
,但如果该过程不存在,您最终可能会收到错误消息。在删除之前检查它是一种很好的做法。
表,视图,存储过程等都具有OBJECT_ID作为密钥标识符。
我不相信你可以使用LIKE
删除多个存储过程。 (虽然我不是100%肯定的)
答案 1 :(得分:1)
我担心你不能在DROP中使用类似的语法,在简单的一行内容下面删除多个程序。
DROP PROCEDURE testest,testest1
对于你的第二个问题。我们可以创建只能由特定角色访问的Storedprocedure。
create proc dbo.testest
as
begin
select 1
end
使用角色值
查询sys.objectsselect * from sys.objects where name ='dbo.testest'
它返回null
select * from sys.objects where name ='testest'
现在可行了
sys.objects目录视图存储没有角色名称的信息(仅名称)。但是使用OBJECT_ID,我们可以检索角色特定信息
select OBJECT_ID('dbo.testest') //works
select OBJECT_ID('testest') //works
希望你现在能理解。
答案 2 :(得分:1)
我认为SQL设计有这个限制,drop procedure命令需要一个字符串常量。您也不能将变量作为参数传递,它只会在您执行时产生“错误的语法”错误。
此外,OBJECT_ID函数仅返回用户拥有或拥有权限的对象的有效ID。因此使用OBJECT_ID是因为它执行安全性验证。
仅使用“WHERE name ='object_name'”进行删除也可以,但前提是用户具有该对象的权限。