为什么要在SQL存储过程中使用GO后写入GRANT?

时间:2010-09-29 02:17:46

标签: sql sql-server tsql sql-server-2008

我们编写了一个存储过程并且在SP的最后一行写了一个GRANT。我们的DBA建议在GRANT语句之前应该有一个GO,否则每次都会执行。

这是什么意思?我不确定GO将如何阻止GRANT“每次”执行。

3 个答案:

答案 0 :(得分:9)

存储过程定义不必以和END结尾。如果您定义了您的程序 像这样:

CREATE PROCEDURE MySP AS
SELECT field1, field2 FROM table;

GO

GRANT EXECUTE ON MySP TO user1;

...然后SQL Server将创建一个返回结果集的过程,并将该存储过程的执行权限授予user1

如果你做了这样的事情,那么:

CREATE PROCEDURE MySP AS
SELECT field1, field2 FROM table;

GRANT EXECUTE ON MySP TO user1;

...然后SQL Server将创建一个两者返回结果集的过程,每次该存储过程都会授予执行权限被执行。换句话说,GRANT包含在存储过程的定义中。可能不是你想要的。

GO语句用于标记SQL Server中批处理的结尾。它毫不含糊地告诉SQL Server“我已经完成了我在前一组语句中执行的任何操作”。将它添加到创建脚本中每个定义的末尾是非常好的做法;这个确切的情况在过去曾经不止一次地咬过我。

答案 1 :(得分:1)

您的DBA意味着此GRANT将成为您的存储过程的一部分,因此每次执行您的过程时都会执行。 通常不允许用户授予权限,因此每次执行最后一个命令时,您的过程都应该引发错误。

答案 2 :(得分:0)

GO是查询分析器中使用的默认命令分隔符,您实际上可以将其配置为您想要的任何内容。你也可以通过在proc体周围使用BEGIN..END来达到同样的目的。