可以创建用于所有数据库的SQL存储过程

时间:2011-09-07 05:31:41

标签: sql stored-procedures sql-server-2008-r2 global

我的SQL服务器中的一个数据库中有一个存储过程,它为该特定数据库一次设置所有存储过程的权限。有没有办法以某种方式创建这个存储过程我可以从SQL服务器中的任何数据库轻松调用它,如果是这样我怎么去做这样的事情

3 个答案:

答案 0 :(得分:0)

您是否尝试过3或4部分名称?

InstanceName.DatabaseName.dbo.usp_Name

该过程可以依次使用相同的约定引用其他数据库中的对象。因此,您可以参数化要操作的数据库的名称,并使用动态SQL生成4个部件名称以引用对象,例如系统表。

答案 1 :(得分:0)

  

我的SQL服务器中的一个数据库中有一个存储过程   为该特定一次设置所有存储过程的权限   数据库。

您可以更轻松地归档相同的结果:

  • 创建一个新角色,例如db_executor

    CREATE ROLE db_executor
    
  • 授予该角色执行权限而不指定任何对象:

    GRANT EXECUTE TO db_executor
    

此角色现在具有所有存储过程和函数的执行权限 - 它甚至会为您添加到数据库的以后的任何存储过程获得相同的权限!

只需将此角色分配给您需要的用户,您就完成了....

答案 2 :(得分:0)

虽然这个授予所有程序执行权的特定问题的最佳解决方案是the one provided by marc_s,但实际问题是有一种方法可以创建单个存储过程并使其可供所有数据库使用。

https://nickstips.wordpress.com/2010/10/18/sql-making-a-stored-procedure-available-to-all-databases/

记录了执行此操作的方法
  1. master数据库中创建存储过程。
  2. 必须将其命名为以sp_开头,例如sp_MyCustomProcedure
  3. 执行sys.sp_MS_marksystemobject传递过程的名称,例如EXEC sys.sp_MS_marksystemobject sp_MyCustomProcedure
  4. 这是一个简单的例子,它只选择当前数据库的名称:

    use master
    go
    
    create procedure dbo.sp_SelectCurrentDatabaseName as begin
        select db_name()
    end
    go
    
    execute sys.sp_MS_marksystemobject sp_SelectCurrentDatabaseName
    go
    

    然后在任何数据库上调用exec dbo.sp_SelectCurrentDatabaseName都可以。

    要将该过程标记为不是系统对象,在https://social.msdn.microsoft.com/Forums/sqlserver/en-US/793d0add-6fd9-43ea-88aa-c0b3b89b8d70/how-do-i-undo-spmsmarksystemobject?forum=sqltools会建议一些讨厌的黑客,但是删除并重新创建过程是最安全和最简单的。

    <强>买者

    当然,创建这样的系统过程违反了不将自己的过程命名为sp_xxx的常见规则,因为它们可能会与SQL Server的未来版本中的内置过程冲突。因此,这应该小心谨慎,而不仅仅是创建一个你认为有用的随机命名过程的负载。

    避免这种情况的一种常见简单方法是将自己的公司/个人前缀添加到Microsoft不太可能使用的过程中,例如: sp_MyCompany_MyCustomProcedure