Stored procedures 从sys中选择OBJECT_DEFINITION(OBJECT_id)。objects仅对表返回NULL
我计划使用以下sp将对象定义导出到文本文件,然后将它们导入SVN。sp可以很好地用于存储过程和视图。但是,当用于用户表时,它会为每个表返回一个正确命名的文件,但内容仅为字符串“NULL” 我试图执行此操作的用户是sql用户。我已经运行了以下程序:Stored procedures 从sys中选择OBJECT_DEFINITION(OBJECT_id)。objects仅对表返回NULL,stored-procedures,sql-server-2008-r2,sqlcmd,database-permissions,Stored Procedures,Sql Server 2008 R2,Sqlcmd,Database Permissions,我计划使用以下sp将对象定义导出到文本文件,然后将它们导入SVN。sp可以很好地用于存储过程和视图。但是,当用于用户表时,它会为每个表返回一个正确命名的文件,但内容仅为字符串“NULL” 我试图执行此操作的用户是sql用户。我已经运行了以下程序: USE [master] GO GRANT VIEW ANY Definition TO bob 这似乎没有什么区别。我还尝试了在特定数据库中运行的替代语法 USE [xxxx] GO GRANT VIEW Definition TO bob 我在
USE [master]
GO
GRANT VIEW ANY Definition TO bob
这似乎没有什么区别。我还尝试了在特定数据库中运行的替代语法
USE [xxxx]
GO
GRANT VIEW Definition TO bob
我在这里错过了什么许可?还是代码问题?数据库服务器是MS SQL 2008R2 SP2
USE [xxxx]
GO
/****** Object: StoredProcedure [dbo].[sp_Export_Objects_to_Files] Script Date: 02/10/2014 10:52:52 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
----------------------------------------------------------
-- Author: xxxx
-- What: Exports objects to individual text files
-- Why: Useful for importing to version control
-- Notes: The user running the SQL server instance will
-- require access to the output path
-----------------------------------------------------------
/*************************************
TYPE type_desc
AF AGGREGATE_FUNCTION
C CHECK_CONSTRAINT
D DEFAULT_CONSTRAINT
F FOREIGN_KEY_CONSTRAINT
FN SQL_SCALAR_FUNCTION
FS CLR_SCALAR_FUNCTION
IF SQL_INLINE_TABLE_VALUED_FUNCTION
IT INTERNAL_TABLE
P SQL_STORED_PROCEDURE
PC CLR_STORED_PROCEDURE
PK PRIMARY_KEY_CONSTRAINT
S SYSTEM_TABLE
SQ SERVICE_QUEUE
TF SQL_TABLE_VALUED_FUNCTION
TR SQL_TRIGGER
U USER_TABLE
UQ UNIQUE_CONSTRAINT
V VIEW
X EXTENDED_STORED_PROCEDURE
****************************************/
ALTER PROCEDURE [dbo].[sp_Export_Objects_to_Files]
@obj_type varchar(2),
@server varchar(100),
@user varchar(100),
@pass varchar(100),
@db varchar(100),
@path varchar(100)
AS
BEGIN
IF RIGHT(@path, 1) <> '\'
BEGIN
SET @path = @path + '\'
END
declare @obj_name varchar(1000)
DECLARE @cmd varchar(4000)
DECLARE @sql varchar(1000)
IF OBJECT_ID('tempdb..#sptemp') IS NOT NULL DROP TABLE #sptemp
CREATE TABLE #sptemp
(
obj_name varchar(1000)
)
INSERT INTO #sptemp (obj_name)
SELECT OBJECT_NAME(object_id)
FROM sys.objects
WHERE type = @obj_type
--select * from #sptemp
DECLARE my_cursor CURSOR FOR
SELECT obj_name
FROM #sptemp
ORDER BY obj_name
OPEN my_cursor
FETCH NEXT FROM my_cursor INTO @obj_name
WHILE @@FETCH_STATUS = 0
BEGIN
SET @sql = 'SET NOCOUNT ON;SELECT OBJECT_DEFINITION(object_id) FROM sys.objects WHERE type='''+ @obj_type + ''' AND name=''' + @obj_name + ''''
SET @cmd = 'sqlcmd -S tcp:' + @server + ' -U ' + @user + ' -P ' + @pass + ' -d ' + @db + ' -y 0 -Q "' + @sql + '" -o ' + @path + @obj_name + '.sql'
PRINT @cmd
EXEC master..xp_cmdshell @cmd
FETCH NEXT FROM my_cursor INTO @obj_name
END
close my_cursor
deallocate my_cursor
END -- end of sp
我被告知对象定义不适用于表SQL Server数据库引擎假定对象id位于当前数据库上下文中。对象定义的排序规则始终与调用数据库上下文的排序规则匹配。