爲什麼不這樣做呢?
- 創建在創建包含所有從服務器上的每個數據庫中
sys.objects
的信息的主數據庫的圖的存儲過程。
- 每當創建一個數據庫執行
CREATE
,ALTER
或DROP
語句被炒魷魚一個DDL Trigger。然後觸發器將在步驟#1中執行存儲過程。這允許視圖自動更新。
- (可選)創建一個用戶定義的函數,該函數查詢給定對象的創建日期的視圖。
存儲過程DDL:
USE [master];
GO
CREATE PROCEDURE dbo.BuildAllServerObjectsView
AS
SET NOCOUNT ON;
IF OBJECT_ID('master.dbo.AllServerObjects') IS NOT NULL
EXEC master..sp_SQLExec 'DROP VIEW dbo.AllServerObjects;';
IF OBJECT_ID('tempdb..Databases') IS NOT NULL
DROP TABLE #Databases;
DECLARE @CreateView varchar(8000);
SET @CreateView = 'CREATE VIEW dbo.AllServerObjects AS' + CHAR(13)+CHAR(10) + CHAR(13)+CHAR(10);
SELECT name COLLATE SQL_Latin1_General_CP1_CI_AS AS 'name'
INTO #Databases
FROM sys.databases
ORDER BY name;
DECLARE @DatabaseName nvarchar(100);
WHILE (SELECT COUNT(*) FROM #Databases) > 0
BEGIN
SET @DatabaseName = (SELECT TOP 1 name FROM #Databases ORDER BY name);
SET @CreateView +='SELECT N'+QUOTENAME(@DatabaseName, '''')+' AS ''database_name''' + CHAR(13)+CHAR(10)
+ ' ,name COLLATE SQL_Latin1_General_CP1_CI_AS AS ''object_name''' + CHAR(13)+CHAR(10)
+ ' ,object_id' + CHAR(13)+CHAR(10)
+ ' ,principal_id' + CHAR(13)+CHAR(10)
+ ' ,schema_id' + CHAR(13)+CHAR(10)
+ ' ,parent_object_id' + CHAR(13)+CHAR(10)
+ ' ,type' + CHAR(13)+CHAR(10)
+ ' ,type_desc' + CHAR(13)+CHAR(10)
+ ' ,create_date' + CHAR(13)+CHAR(10)
+ ' ,modify_date' + CHAR(13)+CHAR(10)
+ ' ,is_ms_shipped' + CHAR(13)+CHAR(10)
+ ' ,is_published' + CHAR(13)+CHAR(10)
+ ' ,is_schema_published' + CHAR(13)+CHAR(10)
+ ' FROM ' + QUOTENAME(@DatabaseName) + '.sys.objects';
IF (SELECT COUNT(*) FROM #Databases) > 1
SET @CreateView += CHAR(13)+CHAR(10) + CHAR(13)+CHAR(10) + ' UNION' + CHAR(13)+CHAR(10);
ELSE
SET @CreateView += ';';
DELETE #Databases
WHERE name = @DatabaseName;
END;
--PRINT @CreateView --<== Uncomment this to see the DDL for the view.
EXEC master..sp_SQLExec @CreateView;
IF OBJECT_ID('tempdb..Databases') IS NOT NULL
DROP TABLE #Databases;
GO
功能DDL:
USE [master];
GO
CREATE FUNCTION dbo.GetObjCreateDate(@DatabaseName sysname, @objName sysname) RETURNS DATETIME AS
BEGIN
DECLARE @result datetime;
SELECT @result = create_date
FROM master.dbo.AllServerObjects
WHERE [database_name] = @DatabaseName
AND [object_name] = @objname;
RETURN @result;
END
GO
用法示例:
SELECT master.dbo.GetObjCreateDate('MyDatabase', 'SomeObject') AS 'Created';
SELECT master.dbo.GetObjCreateDate(DB_NAME(), 'spt_monitor') AS 'Created';
的'information_schema'視圖中的每個數據庫在本地創建。另外,作爲一般規則,主數據庫應該保持獨立。創建一個「實用工具」數據庫來保存這樣的東西。 – 2010-10-27 16:00:47
你可以自己看看。在SSMS中,深入查看數據庫 - > YourDatabase - >視圖 - >系統視圖。 – 2010-10-27 16:06:21
這是行不通的。實用程序中的UDF只會訪問實用程序中的sys.objects,而不是調用數據庫。忽略主控部分,如果這是你的掛斷......我需要來自調用者的sys.objects,而不是UDF託管的db。 – mattmc3 2010-10-27 16:06:51