我们编写了一个存储过程并且在SP的最后一行写了一个GRANT。我们的DBA建议在GRANT语句之前应该有一个GO,否则每次都会执行。
这是什么意思?我不确定GO将如何阻止GRANT“每次”执行。
答案 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来达到同样的目的。