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

Sau*_*mar 3 sql t-sql sql-server sql-server-2008

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

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

Mic*_*tta 9

存储过程定义不必以和结尾END.如果你定义你的程序如下:

CREATE PROCEDURE MySP AS
SELECT field1, field2 FROM table;

GO

GRANT EXECUTE ON MySP TO user1;
Run Code Online (Sandbox Code Playgroud)

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

如果你做这样的事情,但是:

CREATE PROCEDURE MySP AS
SELECT field1, field2 FROM table;

GRANT EXECUTE ON MySP TO user1;
Run Code Online (Sandbox Code Playgroud)

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

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