понедельник, 30 августа 2010 г.

Количество объектов в БД SQL Server

--Для того чтобы узнать сколько различных объектов содержит ваша база данных, можно запустить следующий скрипт:

--Для того чтобы узнать сколько различных объектов содержит ваша база данных, можно запустить следующий скрипт:

SELECT 'Системных Таблиц' AS [Name],COUNT([id]) AS [COUNT]                       , 1 AS [ORDER] FROM [dbo].[sysobjects] WHERE OBJECTPROPERTY([id],'IsSystemTable') = 1 
UNION
SELECT 'Таблиц' AS [Name],COUNT([id]) AS [COUNT]                                  , 2 AS [ORDER] FROM [dbo].[sysobjects] WHERE OBJECTPROPERTY([id],'IsTable') = 1 
UNION
SELECT 'Пользовательских Таблиц' AS [Name],COUNT([id]) AS [COUNT] , 3 AS [ORDER] FROM [dbo].[sysobjects] WHERE OBJECTPROPERTY([id], 'IsUserTable') =1 
UNION
SELECT 'Кол-во таблиц, имеющих индексы',COUNT([id])                                    , 4 AS [ORDER] FROM [dbo].[sysobjects] WHEREOBJECTPROPERTY([id], 'IsIndexed') = 1
UNION
SELECT 'Кол-во таблиц, которые могут иметь индексы',COUNT([id])              , 5 AS [ORDER] FROM [dbo].[sysobjects] WHERE OBJECTPROPERTY([id],'IsIndexable') = 1
UNION
SELECT 'View',COUNT([id])                                                                                       , 6 AS [ORDER] FROM[dbo].[sysobjects] WHERE OBJECTPROPERTY([id], 'IsView') = 1
UNION
SELECT 'Триггеров',COUNT([id])                                                                         , 7 AS [ORDER] FROM [dbo].[sysobjects] WHEREOBJECTPROPERTY([id], 'IsTrigger') = 1
UNION
SELECT 'Процедур',COUNT([id])                                                                           , 8 AS [ORDER] FROM [dbo].[sysobjects] WHEREOBJECTPROPERTY([id], 'IsProcedure') = 1
UNION
SELECT 'Внешних процедур',COUNT([id])                                                            , 9 AS [ORDER] FROM [dbo].[sysobjects] WHEREOBJECTPROPERTY([id], 'IsExtendedProc') = 1
UNION
SELECT 'Правил',COUNT([id])                                                                                       , 10 AS [ORDER] FROM[dbo].[sysobjects] WHERE OBJECTPROPERTY([id], 'IsRule') = 1
UNION
SELECT 'Default',COUNT([id])                                                                            , 11 AS [ORDER] FROM [dbo].[sysobjects]WHERE OBJECTPROPERTY([id], 'IsDefault') = 1
UNION
SELECT 'Ограничений (Check Constraint)',COUNT([id])                                  , 12 AS [ORDER] FROM [dbo].[sysobjects] WHEREOBJECTPROPERTY([id], 'IsCheckCnst') = 1
UNION
SELECT 'Ограничений (Constraint)',COUNT([id])                                                , 13 AS [ORDER] FROM [dbo].[sysobjects] WHEREOBJECTPROPERTY([id], 'IsConstraint') = 1
UNION
SELECT 'PrimaryKeys',COUNT([id])                                                                        , 14 AS [ORDER] FROM [dbo].[sysobjects]WHERE OBJECTPROPERTY([id], 'IsPrimaryKey') = 1
UNION
SELECT 'Scalar Function',COUNT([id])                                                            , 15 AS [ORDER] FROM [dbo].[sysobjects] WHEREOBJECTPROPERTY([id], 'IsScalarFunction') = 1
UNION
SELECT 'Table Valued Function',COUNT([id])                                                      , 16 AS [ORDER] FROM [dbo].[sysobjects] WHEREOBJECTPROPERTY([id], 'IsTableFunction') = 1
ORDER BY 3

SQL Server и ActiveDirectory

Создание подключения к AD

Либо по-простому:
--A little easier way to perform this :-) --Create the linked server EXEC SP_ADDLINKEDSERVER 'ADSI', 'Active Directory Services 2.5','ADSDSOObject', 'adsdatasource' --Create the login account --(change SQL_ACCOUNT_NAME, --NT_ACCOUNT_NAME, PASSSWORD) EXEC SP_ADDLINKEDSRVLOGIN 'ADSI', FALSE, 'SQL_ACCOUNT_NAME','NT_ACCOUNT_NAME', 'PASSWORD' --Execute your query SELECT samAccountName, givenName [FIRST Name], sn [LAST Name],legacyExchangeDN FROM OPENQUERY(ADSI,'SELECT samAccountName, givenName, sn, legacyExchangeDN
   FROM '
'LDAP://DC=zm,DC=COM''
   WHERE objectClass='
'Person''
   AND objectClass = '
'User''') WHERE givenName IS NOT NULL ---------------------------------------------------------------------------------   --из других источников SP_ADDLINKEDSERVER 'ADSI', 'Active Directory Services 2.5', 'ADSDSOObject', 'adsdatasource' GO --удалить можно так --if exists(select 1 from master..sysservers where srvname = 'ADSI') exec sp_dropserver 'ADSI', 'droplogins' --CREATE VIEW viewADUsers AS --SELECT * FROM OpenQuery( ADSI,'
;(objectClass=*);givenname,sn, mail, adspath')
IF OBJECT_ID(N'[dbo].vw_ADUsers') IS NOT NULL DROP VIEW [dbo].vw_ADUsers GO -- Create the 'vw_ADUsers' view CREATE VIEW [dbo].vw_ADUsers AS SELECT      samaccountname,
     givenName,
     [description] FROM OPENQUERY( ADSI,
   'SELECT samaccountname, givenName,description
    FROM '
'LDAP://OU=WCC Users,DC=wcc,DC=net''
   WHERE objectCategory = '
'Person'' AND
                objectClass = '
'User''') GO SELECT * FROM [dbo].vw_ADUsers
либо по полной в 2008:
/****** Object:  LinkedServer [ADSI]    Script Date: 11/16/2009 09:33:13 ******/ EXEC master.dbo.SP_ADDLINKEDSERVER @server = N'ADSI', @srvproduct=N'ActiveDirectory2SQL', @provider=N'ADsDSOObject', @datasrc=N'addatasource'  /* For security reasons the linked server remote logins password is changed with ######## */ EXEC master.dbo.SP_ADDLINKEDSRVLOGIN @rmtsrvname=N'ADSI',@useself=N'False',@locallogin=NULL,@rmtuser=N'RNTC\rpbd',@rmtpassword='########' GO EXEC master.dbo.SP_SERVEROPTION @server=N'ADSI', @optname=N'collation compatible', @optvalue=N'false' GO EXEC master.dbo.SP_SERVEROPTION @server=N'ADSI', @optname=N'data access', @optvalue=N'true' GO EXEC master.dbo.SP_SERVEROPTION @server=N'ADSI', @optname=N'dist', @optvalue=N'false' GO EXEC master.dbo.SP_SERVEROPTION @server=N'ADSI', @optname=N'pub', @optvalue=N'false' GO EXEC master.dbo.SP_SERVEROPTION @server=N'ADSI', @optname=N'rpc', @optvalue=N'false' GO EXEC master.dbo.SP_SERVEROPTION @server=N'ADSI', @optname=N'rpc out', @optvalue=N'false' GO EXEC master.dbo.SP_SERVEROPTION @server=N'ADSI', @optname=N'sub', @optvalue=N'false' GO EXEC master.dbo.SP_SERVEROPTION @server=N'ADSI', @optname=N'connect timeout', @optvalue=N'0' GO EXEC master.dbo.SP_SERVEROPTION @server=N'ADSI', @optname=N'collation name', @optvalue=null
GO EXEC master.dbo.SP_SERVEROPTION @server=N'ADSI', @optname=N'lazy schema validation', @optvalue=N'false' GO EXEC master.dbo.SP_SERVEROPTION @server=N'ADSI', @optname=N'query timeout', @optvalue=N'0' GO EXEC master.dbo.SP_SERVEROPTION @server=N'ADSI', @optname=N'use remote collation', @optvalue=N'true' GO EXEC master.dbo.SP_SERVEROPTION @server=N'ADSI', @optname=N'remote proc transaction promotion', @optvalue=N'true' GO
SELECT * -- , description,   FROM      OPENQUERY(ADSI, 'select cn,sn, givenname, ou, mail,displayname, samaccountname, distinguishedname, name,
 l, title, physicaldeliveryofficename, telephonenumber, department
 , company, streetaddress, userprincipalname,   manager
 , mailnickname, homephone, pager, mobile, postalcode
 from     '
'LDAP://avrora/ DC = rntc, DC = ru''
 where     objectCategory = '
'Person''  
order by sn'
)

Перебрать по буквам с A - Z (Т.к. есть ограничение на 1000 записей)

CREATE TABLE #tmpADUsers
 (  employeeId VARCHAR(10) NULL,
  SAMAccountName VARCHAR(255) NOT NULL,
  email  VARCHAR(255) NULL) GO /* AD is limited to send 1000 records in one batch. In an ADO interface you can define this batch size, not in OPENQUERY.
Because of this limitation, we just loop through the alphabet.
*/
DECLARE @cmdstr VARCHAR(255) DECLARE @nAsciiValue SMALLINT DECLARE @sChar CHAR(1) SELECT @nAsciiValue = 65 WHILE @nAsciiValue < 91  BEGIN   SELECT @sChar=  CHAR(@nAsciiValue)   EXEC master..XP_SPRINTF @cmdstr OUTPUT, 'SELECT employeeId, SAMAccountName, Mail FROM OPENQUERY( ADSI, ''SELECT Mail, SAMAccountName, employeeID FROM ''''LDAP://avrora/ DC = rntc, DC = ru''''WHERE objectCategory = ''''Person'''' AND SAMAccountName = ''''%s*'''''' )', @sChar

  INSERT #tmpADUsers
  EXEC( @cmdstr )   SELECT @nAsciiValue = @nAsciiValue + 1  END SELECT* FROM #tmpADUsers --DROP TABLE #tmpADUsers

Или так

SELECT users.sAMAccountName AS userName, objectsid,name,RTRIM(LTRIM(isnull(givenName,'')+' ' +isnull(sn,'')))AS fullname FROM OPENQUERY( ADSI, 'SELECT name, sn,givenName,sAMAccountName,objectsid FROM ''LDAP://DC=madomaine,DC=com'' WHERE objectCategory = ''Person'' AND objectClass= ''user'' AND ( NAME = ''A*'' OR NAME = ''B*'' OR NAME = ''C*'' OR NAME = ''D*'' OR NAME = ''E*'' OR NAME = ''F*'' OR NAME = ''G*'')')AS users UNION SELECT users.sAMAccountName AS userName, objectsid,name,RTRIM(LTRIM(isnull(givenName,'')+' ' +isnull(sn,'')))AS fullname FROM OPENQUERY( ADSI, 'SELECT name, sn,givenName,sAMAccountName,objectsid FROM ''LDAP://DC=madomaine,DC=com'' WHERE objectCategory = ''Person'' AND objectClass= ''user'' AND ( NAME = ''H*'' OR NAME = ''I*'' OR NAME = ''J*'' OR NAME = ''K*'' OR NAME = ''L*'' OR NAME = ''M*'' OR NAME = ''N*'')')AS users UNION SELECT users.sAMAccountName AS userName, objectsid,name,RTRIM(LTRIM(isnull(givenName,'')+' ' +isnull(sn,'')))AS fullname FROM OPENQUERY( ADSI, 'SELECT name, sn,givenName,sAMAccountName,objectsid FROM ''LDAP://DC=madomaine,DC=com'' WHERE objectCategory = ''Person'' AND objectClass= ''user'' AND ( NAME = ''O*'' OR NAME = ''P*'' OR NAME = ''Q*'' OR NAME = ''R*'' OR NAME = ''S*'' OR NAME = ''T*'' OR NAME = ''U*'')')AS users UNION SELECT users.sAMAccountName AS userName, objectsid,name,RTRIM(LTRIM(isnull(givenName,'')+' ' +isnull(sn,'')))AS fullname FROM OPENQUERY( ADSI, 'SELECT name, sn,givenName,sAMAccountName,objectsid FROM ''LDAP://DC=madomaine,DC=com'' WHERE objectCategory = ''Person'' AND objectClass= ''user'' AND ( NAME = ''V*'' OR NAME = ''W*'' OR NAME = ''X*'' OR NAME = ''Y*'' OR NAME = ''Z*'' )') AS users

Нельзя получить поля из АД через SQL

  1. DESCRIPTION
  2. POSTOFFICEBOX
  3. memberOf

Получить описание полей в SQL Server

Получить описание Таблиц

/*To add an extended property*/ SP_ADDEXTENDEDPROPERTY /*To update an extended property*/ SP_UPDATEEXTENDEDPROPERTY /*To delete an extended property*/ SP_DROPEXTENDEDPROPERTY /*To view an extended property*/ FN_LISTEXTENDEDPROPERTY sys.extended_properties -- 2000 SELECT * FROM ::FN_LISTEXTENDEDPROPERTY(NULL, N'user', N'dbo', N'table', N'Area', NULL, NULL) xp --- 2008  SELECT * FROM sys.extended_properties

Cписок полей для 2000

EXEC SP_ADDEXTENDEDPROPERTY 'MS_Description', 'some description', 'user', dbo, 'table', table_name, 'column', column_name SELECT     [TABLE Name] = i_s.TABLE_NAME,
    [COLUMN Name] = i_s.COLUMN_NAME,
    [Description] = s.VALUE FROM     INFORMATION_SCHEMA.COLUMNS i_s LEFT OUTER JOIN     sysproperties s ON     s.id = OBJECT_ID(i_s.TABLE_SCHEMA+'.'+i_s.TABLE_NAME)     AND s.smallid = i_s.ORDINAL_POSITION     AND s.name = 'MS_Description' WHERE     OBJECTPROPERTY(OBJECT_ID(i_s.TABLE_SCHEMA+'.'+i_s.TABLE_NAME), 'IsMsShipped')=0     -- AND i_s.TABLE_NAME = 'table_name'  ORDER BY     i_s.TABLE_NAME, i_s.ORDINAL_POSITION

Список полей для 2005 и 2008

 SELECT     [TABLE Name] = OBJECT_NAME(c.OBJECT_ID),
    [COLUMN Name] = c.name,
    [Description] = ex.VALUE FROM     sys.columns c LEFT OUTER JOIN     sys.extended_properties ex ON     ex.major_id = c.OBJECT_ID     AND ex.minor_id = c.column_id     AND ex.name = 'MS_Description' WHERE     OBJECTPROPERTY(c.OBJECT_ID, 'IsMsShipped')=0     -- AND OBJECT_NAME(c.object_id) = 'your_table'  ORDER     BY OBJECT_NAME(c.OBJECT_ID), c.column_id

Разные запросы и полезняшки по SQL SERVER

--Информация по серверу
SELECT @@VERSION, SERVERPROPERTY('productversion') productversion, SERVERPROPERTY ('productlevel') productlevel

Способы подсчета количества записей в каждой из таблиц базы данных
--Способ 1: Поскольку приведенный ниже sql-код для подсчета количества записей использует таблицу sysindexes, его результат зависит от того, была ли обновлена статистика.
EXEC sp_msforeachtable 'UPDATE STATISTICS ?'
SELECT SUBSTRING(o.name, 1, 30) Table_Name ,i.ROWS Number_of_Rows
FROM sysobjects o
INNER join sysindexes i
ON (o.id = i.id)
WHERE o.xtype = 'u'
and i.indid < 2
ORDER BY o.name

--Способ 2: Следующий sql-код также может быть использован для определения количества записей в таблицах базы данных. Для подсчета числа строк этот sql-код использует функцию агрегации. Обрамление кавычками выбранного названия таблицы необходимо для обработки пробелов в названии (если такие названия существуют).
SET NOCOUNT ON
   DECLARE tables_cursor CURSOR
      FOR
      SELECT name FROM sysobjects WHERE type = 'U' ORDER BY 1
   OPEN tables_cursor
   DECLARE @tablename VARCHAR(50)
   FETCH NEXT FROM tables_cursor INTO @tablename
   WHILE (@@FETCH_STATUS <> -1)
   BEGIN
   SELECT @tablename = QUOTENAME(@tablename, '[]')
      DECLARE @CMD VARCHAR(100)
      PRINT @TABLENAME
      SELECT @CMD = ' select count(*) from '+@tablename+' '
   EXEC (@CMD)
      FETCH NEXT FROM tables_cursor INTO @tablename
   END
   DEALLOCATE tables_cursor
   SET NOCOUNT OFF
  
--Способ 3: Для решения поставленной задачи можно также использовать недокументированную хранимую процедуру sp_Msforeachtable. Sp_Msforeachtable сканирует все таблицы в определенной базе данных и выполняет указанную sql-команду (ы) для каждой из таблиц. Для подстановки имени таблицы используется символ "?".
sp_msforeachtable @command1= 'print ''?''', @command2 = "select count(*) from ?"