我的SQL服务器中的一个数据库中有一个存储过程,它为该特定数据库一次设置所有存储过程的权限。有没有办法以某种方式创建这个存储过程我可以从SQL服务器中的任何数据库轻松调用它,如果是这样我怎么去做这样的事情
答案 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/:
记录了执行此操作的方法master
数据库中创建存储过程。sp_
开头,例如sp_MyCustomProcedure
sys.sp_MS_marksystemobject
传递过程的名称,例如EXEC sys.sp_MS_marksystemobject sp_MyCustomProcedure
这是一个简单的例子,它只选择当前数据库的名称:
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
。