代码之家  ›  专栏  ›  技术社区  ›  Saurabh Kumar

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

  •  3
  • Saurabh Kumar  · 技术社区  · 15 年前

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

    这是什么意思?我不知道如何去阻止格兰特执行“每一次”。

    3 回复  |  直到 15 年前
        1
  •  9
  •   Michael Petrotta user3140870    15 年前

    存储过程定义不必以和结尾 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 包含在存储过程的定义中。可能不是你想要的。

    A GO 语句用于在SQL Server中标记批处理的结束。它毫不含糊地告诉SQLServer“我已经完成了上一组语句中执行的所有操作”。在create脚本的每一个定义的末尾都添加这一点是非常好的做法;这种情况在过去不止一次地困扰着我。

        2
  •  1
  •   A-K    15 年前

    通常不应允许用户授予特权,因此您的过程每次执行最后一个命令时都应引发错误。

        3
  •  0
  •   BlackICE    15 年前

    推荐文章